2017-01-05 3 views
4

Так что я использую Vue 2.0 и Laravel 5.3 для создания приложения.Laravel - query builder - левое объединение полиморфных отношений, отличное только

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

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

Чтобы включить сортировку, мне пришлось использовать построитель запросов, так как вы не можете сортировать отношения, используя 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...

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

EDIT:

я был в состоянии исправить с помощью:

$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.

+0

Проблема с группировкой. См. Ответ, который я добавил ниже – Gayan

ответ

1

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

Для решения этого изменения

'strict' => true, 

В mysql конфигурации под connections в файле config/database.php для

'strict' => false, 

Кроме того, я бы настоятельно рекомендуем использовать polymorphic relations над левой присоединиться к красноречивым.

+1

Спасибо, Гаян! Первоначально я обнаружил, что исправил здесь: https://github.com/laravel/framework/issues/15232, но не хотел отключать строгий режим, поскольку я не знал, каковы были последствия. С тех пор я отключил его, и он работает. Я действительно использую полиморфные отношения, которые отлично работают. Однако я использую построитель запросов, поэтому мне нужно вручную подключать мои таблицы через соединения. Спасибо за вашу помощь! – Kingsley

+0

К сожалению, я имел в виду эту проблему: https://github.com/laravel/framework/issues/14997#issuecomment-242129087 – Kingsley

+1

Рад, что вы нашли это полезным. Подробнее о 'mysql strict mode' можно найти здесь https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel-5-2 – Gayan

1

Я думаю, вы добавите его здесь:

$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'); 
Смежные вопросы