我正在编写一个带有多个LEFT JOIN的MySQL查询(带有laravel查询生成器)。结果我得到的数组看起来像:
array:4 [▼
0 => {#322 ▼
+"id": 19
+"thing_id": 7
+"title": "new translate"
+"locale": "en"
+"thing_sub_cat_id": 19
+"name": "WINTER"
}
1 => {#323 ▼
+"id": 24
+"thing_id": 7
+"title": "new translate"
+"locale": "en"
+"thing_sub_cat_id": 24
+"name": "DIVING"
}
2 => {#324 ▼
+"id": 37
+"thing_id": 15
+"title": "thing to do"
+"locale": "en"
+"thing_sub_cat_id": 37
+"name": "LATEST HAPPENINGS"
}
3 => {#325 ▼
+"id": 21
+"thing_id": 2
+"title": "Main page"
+"locale": null
+"thing_sub_cat_id": null
+"name": null
}
]
查询构建器:
DB::table('things_translations')
->leftjoin('things_sub_cat_rel', 'things_sub_cat_rel.thing_id', '=', 'things_translations.thing_id')
->leftjoin('things_sub_cat_translations', 'things_sub_cat_rel.thing_sub_cat_id', '=', 'things_sub_cat_translations.thing_sub_cat_id')
->where('things_translations.locale', '=', 'en')
->get();
与laravel-translatable包相关联的locale
列。我试图获取具有locale=en
的所有数据库行。我使用了laravel eloquent,但我得到unknown column locale
所以我已经尝试过上面的查询构建器。
关联模式:
与ThingTranslation
属于同一种关系的 ThingSubCat
。例如,让我说我有3个表1表示第1类用于类别,1表示用于具有articleID和categoryID的关系。
我想知道组合具有相同" thing_id"的数组的更好方法。例如上面我有两个带有thing_id的数组:7。我可以将这两个数组合并为一个使用mysql和" name"有多个数组的值?
答案 0 :(得分:0)
我认为你应该在mysql中使用GROUP_CONCAT
函数,如下所示:
SELECT tbl.*,
GROUP_CONCAT(`name` SEPERATOR ',') as `name_combined`
FROM
(
SELECT * FROM things_translations
LEFT JOIN things_sub_cat_rel ON things_sub_cat_rel.thing_id = things_translations.thing_id
LEFT JOIN things_sub_cat_translations ON things_sub_cat_rel.thing_sub_cat_id = things_sub_cat_translations.thing_sub_cat_id
WHERE things_translations.locale = 'en'
) tbl
GROUP BY things_id;
通过这样的查询,您可以将name
与thing_id
相似的行合并为一行。
语法参考:
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
答案 1 :(得分:0)
*如果有人对laravel有同样的问题,他可以看看下面我的答案。如果有人有类似的问题,他可以尝试在Ramin Omrani的答案中查询。它很完美。
我已经找到了解决方案,并且有着雄辩的说法。问题是因为我使用laravel-translatable包。并且获取具有locale =" en"的行的唯一方法正在使用whereHas
translations
,然后使用where子句,如下面的代码:
$getThing = Thing::with('subCategories')->whereHas('translations', function ($query) {
$query->where('locale', '=', 'en');
})->get();