首页 > 解决方案 > 根据 Eloquent 模型中的值使用 2 个不同的列

问题描述

这里有一个奇怪的场景,我会尽力解释它,我基本上合并了 2 个非常相似但使用不同列名的独立系统。

因此,tablea一个 tableb,但是tableb是使用 columnid_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');
    }

}

想法?

标签: phpeloquent

解决方案


一个建议是在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');
    }
}

推荐阅读