SQL LEFT JOIN - 合并具有相同 ID 的数组

SQL LEFT JOIN - Combine arrays with the same id

我正在编写一个具有多个 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();

locale 列与 laravel-translatable 包关联。我正在尝试获取具有 locale=en 的所有数据库行。我会使用 laravel eloquent 但我得到了 unknown column locale 所以我尝试了上面的查询构建器。

关联模型:

ThingTranslationThingSubCat 有 belongsToMany 关系。例如,假设我有 3 个表,1 个用于文章,1 个用于类别,1 个用于具有文章 ID 和类别 ID 的关系。

我想知道合并具有相同 "thing_id" 的数组的更好方法。例如上面我有两个带有 thing_id 的数组: 7. 我可以使用 mysql 将这两个数组合并为一个数组并且 "name" 有多个数组吗?

我认为你应该像这样在 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

*如果有人对laravel有同样的问题,他可以看看我下面的回答。如果有人有类似的问题,他可以尝试 Ramin Omrani 的答案中的查询。效果很好。

我找到了 laravel eloquent 的解决方案。问题是因为我正在使用 laravel-translatable 包。获取具有 locale = "en" 的行的唯一方法是使用 whereHas translations 然后使用 where 子句,如以下代码:

$getThing = Thing::with('subCategories')->whereHas('translations', function ($query) {
    $query->where('locale', '=', 'en');
})->get();