Как заставить Laravel накрывать на стол «палку» для коллекции - PullRequest
0 голосов
/ 09 октября 2018

У нас есть модель Laravel, и иногда мы хотим получить данные из ее таблицы по умолчанию, а иногда из другой таблицы.Все это работает с точки зрения данных, но когда коллекция возвращается из альтернативной таблицы, атрибут «table» все еще ссылается на исходную таблицу (даже если данные получены из другой, как и ожидалось).

Если мы используем dd () getTable (), это правильно:

$model = COUNTRY;
$table = "countires";
$org_id = 1;
$org_collection = $model->setTable('merge_' . $table)->get() 
  ->where('organization_id', $org_id)->keyBy('id');
dd($model->getTable()); // *** THIS SHOWS THE 2nd TABLE AS EXPECTED

dd () выход:

"merge_countries"

Но с точно таким же кодом, еслимы dd () получаем, что атрибут таблицы в коллекции по-прежнему 1-й («orgs»), а не «merge_orgs», как ожидалось, даже если данные правильно поступают из таблицы «merge_orgs»:

$model = COUNTRY;
$table = "countires";
$org_id = 1;
$org_collection = $model->setTable('merge_' . $table)->get() 
  ->where('organization_id', $org_id)->keyBy('id');
dd($org_collection); // *** THIS SHOWS THE 1st TABLE EVEN THOUGH THE getTable() ABOVE DOES NOT

dd () вывод:

Collection {#297
  #items: array:1 [
    3 => Country {#295
      #connection: "common"
      #table: "countries" <---- WHY IS THIS NOT 'merge_countries'???
      #hidden: array:2 [
        0 => "created_at"
        1 => "updated_at"
      ]
      #appends: array:1 [
        0 => "level"
      ]
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:7 [
        "id" => 3
        "organization_id" => 1
        "region_id" => 2
        "name" => "Southpark"
        "active" => 1
        "created_at" => "2018-06-21 14:05:36"
        "updated_at" => "2018-06-21 13:25:27"
      ]
      #original: array:7 [
        "id" => 3
        "organization_id" => 1
        "region_id" => 2
        "name" => "Southpark"
        "active" => 1
        "created_at" => "2018-06-21 14:05:36"
        "updated_at" => "2018-06-21 13:25:27"
      ]
      #changes: []
      #casts: []
      #dates: []
      #dateFormat: null
      #dispatchesEvents: []
      #observables: []
      #relations: []
      #touches: []
      +timestamps: true
      #visible: []
      #fillable: []
      #guarded: array:1 [
         0 => "*"
      ]
    }
  ]
}

Есть идеи, как решить эту проблему?Мы не уверены, что еще можно попробовать на этом этапе.Laravel, если 5,6, если это имеет значение.

1 Ответ

0 голосов
/ 11 октября 2018

ОК, ссылка на исправление и более подробная информация на github.com/laravel/framework/issues/26058.Тем временем вы также можете переопределить метод newInstance модели в признаке, чтобы обойти его:

public function newInstance($attributes = [], $exists = false)
{
  // Overridden in order to allow for late table binding.
  $model = parent::newInstance($attributes, $exists);
  $model->setTable($this->table);

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