这里有一个奇怪的场景并且会尽力解释它,我基本上合并了两个非常相似但使用不同列名的独立系统。
因此,tablea有一个tableb,但tableb是使用列id_1
或id_2
选择的。
在直接使用模型时,此检查在本地范围内完成:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Tableb extends Model
{
protected $table = 'tableb';
public function scopeMode(Builder $query, $id)
{
if (env('DEMO_MODE')) {
return $query->where('id1', '=', $id);
}
return $query->where('id2', '=', $id);
}
}
所以使用上面的模型如下工作正常:
Tablea::mode()->first();
但是,在关系中使用它会产生问题,因为相关的列名可以更改,所以我必须在此关系中执行相同的逻辑,但我想在一个地方(tableb)执行所有这些逻辑以避免在其他关系:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Tablea extends Model
{
public function Tableb()
{
if (env('DEMO_MODE')) {
return $this->hasOne(Tableb::class, 'id2', 'tableb_id');
}
return $this->hasOne(Tableb::class, 'id1', 'tableb_id');
}
}
想法?
一个建议是在tableb
上创建一个静态函数,返回哪个id应该在tablea
中使用,如下所示:
(注意:我还没有测试过代码)
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Tableb extends Model
{
protected $table = 'tableb';
public function scopeMode(Builder $query, $id)
{
return $query->where(self::getId(), '=', $id);
}
public static function getId()
{
return env('DEMO_MODE') ? 'id2' : 'id1';
}
}
然后
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Tablea extends Model
{
public function Tableb()
{
return $this->hasOne(Tableb::class, Tableb::getId(), 'tableb_id');
}
}