Laravel - построитель запросов - полиморфные отношения соединения слева, только отдельные

Итак, я использую Vue 2.0 и Laravel 5.3 для создания приложения.

Я реализовал свою собственную сортируемую таблицу с помощью Vue, используя встроенную разбивку на страницы, предоставляемую Laravel.

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

Чтобы включить сортировку, мне пришлось использовать построитель запросов, так как вы не можете сортировать отношения с помощью Eloquent (AFAIK).

Я определяю свои отношения так:

$inventories = $inventories->leftjoin('users as inventory_user', 'inventories.user_id', '=', 'inventory_user.id');
$inventories = $inventories->leftjoin('categories as category', 'inventories.category_id', '=', 'category.id');
$inventories = $inventories->leftjoin('inventories as parent', 'inventories.parent_id', '=', 'parent.id');

Которые отлично работают. Однако как именно мне оставить присоединиться к полиморфным отношениям, не повторяя (дублируя) какие-либо строки?

У меня есть это:

$inventories = $inventories->leftJoin('media', function($q) {
    $q->on('media.model_id', '=', 'inventories.id');
    $q->where('media.model_type', '=', 'App\Models\Inventory');
});

Что показывает медиа (если у него есть отношение в полиморфной таблице). Однако, если, например, у меня есть 5 изображений (носителей) для одного конкретного элемента инвентаря, мой запрос повторяет инвентаризацию для любых носителей, которые в моем случае повторяются 5 раз.

Это мой выборочный запрос:

    $inventories = $inventories->select(DB::raw("
            inventories.id as inventory_id,
            inventories.name as inventory_name,
            inventories.order_column as inventory_order_column,
            category.id as category_id,
            category.name as category_name,
            parent.name as parent_name,
            parent.id as parent_id,
            inventories.updated_at as inventory_updated_at,
            media.name
    "));

Я думаю, мне нужно использовать groupBy, но я не уверен, где я его определяю. Если я сделаю

$inventories = $inventories->groupBy('inventories.id');

Я получаю SQLSTATE[42000]: Syntax error or access violation: 1055 'test.inventories.name' isn't in GROUP BY...

Кто-нибудь был в подобной ситуации или знает, где разместить мою группу, чтобы показать 1 / отдельные предметы инвентаря?

РЕДАКТИРОВАТЬ:

Я смог исправить, используя:

$inventories = $inventories->leftJoin('media', function($q) {
    $q->on('media.model_id', '=', 'inventories.id');
    $q->where('media.model_type', '=', 'App\Models\Inventory');
    $q->orderBy('media.order_column', 'asc');
    $q->groupBy('model.model_id');
});

а затем установив strict => false в моем database.php.


person Kingsley    schedule 05.01.2017    source источник
comment
Проблема в группировке. См. Ответ, который я добавил ниже   -  person Gayan    schedule 06.01.2017
comment
FWIW, я бы не назвал это исправлением, в лучшем случае обходным путем. Добавьте имя столбца ('model.mode_id' из вашего примера), которое вы группируете, в оператор SELECT, и ошибка исчезнет, ​​и вы можете / должны сохранить строгую настройку.   -  person Didzis    schedule 26.01.2021
comment
Если я когда-нибудь еще раз взгляну на эту кодовую базу, мне придется это проверить! Я помню, как меня тошнило из-за отключения strict, но обходной путь исправил это, поэтому я забыл об этом.   -  person Kingsley    schedule 27.01.2021


Ответы (2)


Как указано в сообщении об ошибке, эта проблема возникает, когда столбец name не находится в предложении GROUP BY.

Чтобы решить эту проблему

'strict' => true, 

В mysql конфигурации под connections в вашем config/database.php файле, чтобы

'strict' => false,

Кроме того, я настоятельно рекомендую использовать полиморфные отношения над левым соединением с красноречивым .

person Gayan    schedule 06.01.2017
comment
Спасибо, Гаян! Изначально я нашел это исправление здесь: github.com/laravel/framework/issues/15232 но не хотел отключать строгий режим, так как не знал, каковы будут последствия. С тех пор я отключил его, и он работает. Я действительно использую полиморфные отношения, которые отлично работают. Однако я использую построитель запросов, поэтому мне приходится вручную подключать свои таблицы через объединения. Спасибо за вашу помощь! - person Kingsley; 06.01.2017
comment
Извините, я имел в виду эту проблему: github.com/laravel/framework/issues/ < / а> - person Kingsley; 06.01.2017
comment
Ах, это так много объясняет! Спасибо, Гаян! - person Kingsley; 06.01.2017

Думаю, ты сюда добавишь:

$categories = $categories->select(DB::raw("
        inventories.id as inventory_id,
        inventories.name as inventory_name,
        inventories.order_column as inventory_order_column,
        category.id as category_id,
        category.name as category_name,
        parent.name as parent_name,
        parent.id as parent_id,
        inventories.updated_at as inventory_updated_at,
        media.name
"))->groupBy('inventories.id');
person Serg Chernata    schedule 05.01.2017