Удобно, что модель laravel предоставляет метод, позволяющий возвращать результаты из другой связанной таблицы.
Например, у меня есть таблица, называемая элементом, а другая таблица называется обратной связью, где в таблице обратной связи хранится обратная связь элемента в таблице элементов. Итак, чтобы получить всю обратную связь элемента с идентификатором 1, я сделаю следующее:
Item::find(1)->feedback;
И после этого распечатается возвращаемый объект.
Illuminate\Database\Eloquent\Collection Object
( [items:protected] => Array
(
[0] => Feedback Object
(
[table:protected] => feedback
[connection:protected] =>
[primaryKey:protected] => id
[perPage:protected] => 15
[incrementing] => 1
[timestamps] => 1
[attributes:protected] => Array
(
[id] => 1
[rma_id] => 3
[item_id] => 8
[quo_id] => 0
[case_id] => i2eM20160120
[line_no] => 000001
[content] => test
[status] => sent
[read] => 0
[sender] => Tester
[created_at] => 2016-01-20 18:03:44
[updated_at] => 2016-01-20 18:03:44
)
[original:protected] => Array
(
[id] => 1
[rma_id] => 3
[item_id] => 8
[quo_id] => 0
[case_id] => i2eM20160120
[line_no] => 000001
[content] => test
[status] => sent
[read] => 0
[sender] => Tester
[created_at] => 2016-01-20 18:03:44
[updated_at] => 2016-01-20 18:03:44
)
[relations:protected] => Array
(
)
[hidden:protected] => Array
(
)
[visible:protected] => Array
(
)
[appends:protected] => Array
(
)
[fillable:protected] => Array
(
)
[guarded:protected] => Array
(
[0] => *
)
[dates:protected] => Array
(
)
[touches:protected] => Array
(
)
[observables:protected] => Array
(
)
[with:protected] => Array
(
)
[morphClass:protected] =>
[exists] => 1
)
)
)
Он отлично работает, и он показывает, что есть только одна обратная связь по элементу с идентификатором 1.
Меня интересует, что набор данных дублируется в [attributes:protected]
и [original:protected]
. Это всего лишь случай тестирования, и реальный случай будет состоять из тысяч отзывов и дублирования данных - огромная трата памяти. Набор данных не дублируется, если я использую подход DB::table('table_name')
, но это гораздо менее удобно.
Почему laravel нужно дублировать данные в модели?
И есть ли способ вернуть только один набор данных?
В настоящее время я использую ->toArray()
, чтобы обрезать ненужные данные сразу после запроса, но использование памяти все еще существует, потому что laravel все еще создает этот набор данных.