根据Eloquent模型中的值,使用2个不同的列

问题描述 投票:2回答:1

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

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

}

想法?

php eloquent
1个回答
2
投票

一个建议是在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');
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.