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

时间:2016-02-03 08:01:53

标签: php mysql laravel join left-join

我正在编写一个带有多个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"有多个数组的值?

2 个答案:

答案 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; 

通过这样的查询,您可以将namething_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();