Groupby в laravel оставить сгруппированные элементы в объекте

Groupby в laravel оставить сгруппированные элементы в объекте

21.01.2018 10:33:31 Просмотров 87 Источник

Правильно, не уверен, что я делаю что-то неправильно или это проблема с 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"
    }
]

}

Так что моя проблема в том, что я хочу избавиться от этих типов в объектах...

Есть идеи?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object#comment83728604_48370863
тогда результат таков: i.imgur.com/CkqohJ3.png
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object#comment83728647_48370863
Можете ли вы попробовать добавить ->get () после group by? Что происходит?
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object#comment83728721_48370863
тогда я получу только 1 результат каждого типа lnik в коде
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object#comment83728822_48370863
Хорошо, вы можете попробовать добавить orderBy два раза, первый раз с идентификатором, а второй- "типы". Ссылка на ссылку и без groupBy
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object#comment83729119_48370863
не уверен, что это то, что вы хотите, чтобы я сделал: ссылка на код и результаты: ссылка на код

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

Nate

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, он больше не будет отображаться в ваших объектах, вы также можете добавить тип в $hiddeninput в своей модели типов следующим образом:

/**
 * 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

https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48370924#comment83728650_48370924
{"message": "неизвестный столбец" семьи.family_id ' in 'on clause'"} ссылка на код
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48370924#comment83728781_48370924
Но: protected $hidden = ['types']; помог, спасибо большое :)
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48370924#comment83728802_48370924
Можете ли вы добавить ->toSql() в запрос и опубликовать результат для меня?
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48370924#comment83729186_48370924
затем я получаю простой текст, например: "выберите families.family_id, families.nameиз familiesлевых типов соединения types.types= families.families.family_id, insects.id"
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48370924#comment83729242_48370924
Сделать запрос работать верхней один,один с GET (), а не toSql();?
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48370924#comment83729630_48370924
В первом мне нужно было измениться insects.id чтобы types.id но тогда я получаю только один объект каждого "типа". Со вторым только тот простой текст (sql querry) " выберите families.types, families.nameиз familiesлевых типов соединения types.types= families.familiesгруппировать по type_id.types, id.types"
Является ответом!
apokryfos

21.01.2018 10:57:54

Хорошо, прежде всего, то, что вы делаете, вызывает groupByв результирующей коллекции, и это не связано с GROUP BY

https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48371092#comment83729149_48371092
{"message": "неизвестный столбец" семьи.family_id' в 'предложении'" }
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48371092#comment83729204_48371092
Я просто добавил mapк вашей существующей (рабочей?) запрашивать. Это не вызвало бы такого сообщения. Кажется, вам не хватает соединения с таблицей familiesв запросе в вашем вопросе. Вы хотели написать insects.family_idвместо этого?
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48371092#comment83729264_48371092
мой код , поэтому первый код, который я установил в качестве комментария, работает, но ваш код выдает эту ошибку... :(
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48371092#comment83729294_48371092
На самом деле вы правы, мой плохой (в leftJoin) я не изменил family_id на type_id, и угадайте, что это работает:) результаты ссылаются на код
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48371092#comment83729443_48371092
Можете ли вы изменить в этом коде 'семьи.family_id ' to ' семьи.type_id' ?
https://stackoverflow.com/questions/48370863/groupby-in-laravel-leave-grouped-items-in-object/48371092#comment83729799_48371092
Взгляните на: laravel.com/docs/5.5/eloquent-relationships вы можете, вероятно, есть модель семьи, а потом делать Families::with([ "insects" => function ($q) { return $q->select("id", "name"); }])->get() он, вероятно, в конечном итоге в один и тот же результат. Там будет еще один запрос, хотя, но в зависимости от ваших структур данных, которые могут быть более эффективными.
Закрыть X