Итак, я использую 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
.
strict
, но обходной путь исправил это, поэтому я забыл об этом. - person Kingsley   schedule 27.01.2021