Laravel - 查询生成器 - 左连接多态关系,仅不同
Laravel - query builder - left join polymorphic relationship, distinct only
所以我正在使用 Vue 2.0 和 Laravel 5.3 创建一个应用程序。
我用 Vue 实现了自己的 sortable table,使用 Laravel 提供的内置分页。
一切正常 - 除了,我试图左连接一个 "media" 多态 table,这样我就可以在我的 table 中显示图像。
要启用排序,我不得不使用查询构建器,因为您无法使用 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');
});
它确实显示媒体(如果它在多态 table 中有关系)。但是,例如,如果我有 5 个图像(媒体)用于 1 个特定的库存项目,我的查询将重复库存,无论媒体有多少,在我的例子中,它重复了 5 次。
这是我的 select 查询:
$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/distinct 库存项目?
编辑:
我可以使用以下方法修复:
$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');
});
然后在我的 database.php
.
中设置 strict => false
我想你会在这里添加它:
$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');
正如错误所述,当 name
列不在 GROUP BY
子句中时会出现此问题。
解决这个变化
'strict' => true,
在 mysql
配置下 connections
在你的 config/database.php
文件到
'strict' => false,
此外,我强烈建议使用 polymorphic relations 而不是左连接 eloquent。
所以我正在使用 Vue 2.0 和 Laravel 5.3 创建一个应用程序。
我用 Vue 实现了自己的 sortable table,使用 Laravel 提供的内置分页。
一切正常 - 除了,我试图左连接一个 "media" 多态 table,这样我就可以在我的 table 中显示图像。
要启用排序,我不得不使用查询构建器,因为您无法使用 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');
});
它确实显示媒体(如果它在多态 table 中有关系)。但是,例如,如果我有 5 个图像(媒体)用于 1 个特定的库存项目,我的查询将重复库存,无论媒体有多少,在我的例子中,它重复了 5 次。
这是我的 select 查询:
$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/distinct 库存项目?
编辑:
我可以使用以下方法修复:
$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');
});
然后在我的 database.php
.
strict => false
我想你会在这里添加它:
$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');
正如错误所述,当 name
列不在 GROUP BY
子句中时会出现此问题。
解决这个变化
'strict' => true,
在 mysql
配置下 connections
在你的 config/database.php
文件到
'strict' => false,
此外,我强烈建议使用 polymorphic relations 而不是左连接 eloquent。