根据雄辩模型中的值使用2个不同的列

时间:2019-04-18 12:48:05

标签: php eloquent

在这里遇到了一个奇怪的情况,将尽我最大的努力来解释它,我基本上是在合并两个非常相似但使用不同列名的单独系统。

因此, 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();

想法?

1 个答案:

答案 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');
    }
}