在这里遇到了一个奇怪的情况,将尽我最大的努力来解释它,我基本上是在合并两个非常相似但使用不同列名的单独系统。
因此, tablea 获得了一个 tableb ,但是 tableb 是使用列{{1} }或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);
}
}
但是,在关联中使用此会出现问题,因为相关的列名可能会更改,因此我必须在该关联中执行相同的逻辑,但是我想在一个地方(表b)进行所有此逻辑以避免在其他关系中做到这一点:
Tablea::mode()->first();
想法?
答案 0 :(得分:2)
建议在tableb
上创建一个静态函数,该函数返回tablea
中应使用的ID,如下所示:
(注意:我尚未测试代码)
<?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');
}
}