Используйте 2 разных столбца в зависимости от значения в Eloquent модели - PullRequest
2 голосов
/ 18 апреля 2019

получил странный сценарий и собираюсь изо всех сил объяснить его, я в основном объединяю две отдельные системы, которые очень похожи, но используют разные имена столбцов.

Итак, tablea имеет one 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();

Тем не менее, использование этого в отношениях тогда имеет проблемы, так как имя связанного столбца может измениться, поэтому я должен сделать ту же логику в этом отношении, но я хочу сделать всю эту логику в одном месте (таблицаb), чтобы избежать делать это в других отношениях:

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

}

Идеи

1 Ответ

2 голосов
/ 18 апреля 2019

Было бы предложено создать статическую функцию на tableb, которая возвращает идентификатор, который должен использоваться в 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');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...