Laravel изменить таблицу моделей прямо перед запросом - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно изменить запрашиваемую таблицу из модели Laravel непосредственно перед началом запроса.

Обычно вы делаете запрос, подобный этому:

ExampleModel::where('column_name', =, 'value')->get();

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

Поэтому мне нужно переключать таблицу ExampleModel только для этой одной ситуации, например:

ExampleModel::table('my_view')->where(...)->get();

Нельзя использовать DB::table('my_view')->where(...)->get() из-за нескольких локальных областей, которые необходимо применить к ExampleModel.

Как я мог видеть, есть следующие опции:

  1. как-то изменить имя таблицы моделей на лету (как показано выше)
  2. Создать новую модель, используемую только в этом случае использования, вид которой определен как модель-таблицы
  3. записать все моиОбласти применения в цепочку DB -команда

Есть ли другие варианты?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

вы можете сделать это, передав имя таблицы методу setTable () , например:

$user = new Users();
$user->setTable('customers');
$user->where(id,1)
...
0 голосов
/ 25 сентября 2019

Единственный способ справиться с этим - иметь выделенную модель для вашего вида с областями применения, применимыми к каждой из соответствующих моделей:


<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class AgeScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('age', '>', 200);
    }
}

Затем в вашей ExampleModel И вам модель MyView

 protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new AgeScope);
    }

Так что, когда вы захотите отредактировать область, она будет отражена в каждом из ваших запросов

НО

Вы всегда будете знать, является ли ваша модель из вашей view_table или изВы таблица example_model.

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

trait ExampleModelTrait
{
   getTestAttribute(){
      return strtolower($this->column_name);
   }
}

, а затем

use ExampleModelTrait;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...