Groupby в laravel оставить сгруппированные элементы в объекте
Правильно, не уверен, что я делаю что-то неправильно или это проблема с Illuminate\Database в Laravel
Мой код:
$sth = Insect::leftJoin('types', 'types.id', '=', 'families.type_id')
->select('types.name as types','families.id','families.name')
->get()
->groupBy('types');
Результат перед groupBy-это:
[
{
"types": "moths",
"id": 1,
"name": "Bombycidae"
},
{
"types": "moths",
"id": 2,
"name": "Brahmaeidae"
},
{
"types": "moths",
"id": 3,
"name": "Cossidae"
},
{
"types": "larvas",
"id": 6,
"name": "test"
}]
но с GroupBy:
{
"moths": [
{
"types": "moths",
"id": 1,
"name": "Bombycidae"
},
{
"types": "moths",
"id": 2,
"name": "Brahmaeidae"
},
{
"types": "moths",
"id": 3,
"name": "Cossidae"
}
],
"larvas": [
{
"types": "larvas",
"id": 6,
"name": "test"
}
]
}
Так что моя проблема в том, что я хочу избавиться от этих типов в объектах...
Есть идеи?






Ответы - Groupby в laravel оставить сгруппированные элементы в объекте / Groupby in laravel leave grouped items in object

21.01.2018 10:40:24
Можно удалить выбранный тип и вместо этого выполнить следующие действия:
$sth = Insect::leftJoin('types', 'types.id', '=', 'families.family_id')
->select('families.id','families.name')
->groupBy('insects.id', 'types.name')
->get();
Кроме того, чтобы увидеть необработанный запрос в действии, вы можете использовать следующее
$sth = Insect::leftJoin('types', 'types.id', '=', 'families.family_id')
->select('families.id','families.name')
->groupBy('insects.id', 'types.name')
->toSql();
dd($sth);
Вы выбрали столбцы для использования в своем объекте, поэтому, если вы удалите его из инструкции select, он больше не будет отображаться в ваших объектах, вы также можете добавить тип в $hidden
input в своей модели типов следующим образом:
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'name',
];
Группировка в laravel: https://laravel.com/docs/5.5/queries#ordering-grouping-limit-and-offset
Скрытие строк из массивов: https://laravel.com/docs/5.5/eloquent-serialization#hiding-attributes-from-json




families
.family_id
, families
.name
из families
левых типов соединения types
.types
= families
.families
.family_id
, insects
.id
"


families
.types
, families
.name
из families
левых типов соединения types
.types
= families
.families
группировать по type_id
.types
, id
.types
"



map
к вашей существующей (рабочей?) запрашивать. Это не вызвало бы такого сообщения. Кажется, вам не хватает соединения с таблицей families
в запросе в вашем вопросе. Вы хотели написать insects.family_id
вместо этого?




Families::with([ "insects" => function ($q) { return $q->select("id", "name"); }])->get()
он, вероятно, в конечном итоге в один и тот же результат. Там будет еще один запрос, хотя, но в зависимости от ваших структур данных, которые могут быть более эффективными.