在项目中,有个需求,比如用户和某件物品,是多对多关系,通过一张表关联,现在我需要在物品列表把物品加入到某个用户,在点击添加后,需要列出所有用户,并且用户已经有该物品的用户排在前面,所以就需要通过关联表判断用户是否已经有该物品,在MySQL中可以使用if语句判断,从而实现排序。
$query = User::find();
$query->select(['{{%user}}.id', '{{%user}}.name', '{{%user}}.create_at', '{{%user}}.status', 'if({{%rel_user_goods}}.goods_id = '.$id.',1,0) as idsort']);
$query->joinWith('userGoods');
在使用joinWidth(left join)时有个问题,就是查询出来的数据不一定时自己需要的数据;
左向外联接的结果集包括 LEFT JOIN子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
由于我只需要左表的数据,所以进行了去重。
$query = User::find();
$query->select(['DISTINCT({{%user}}.id)', '{{%user}}.id', '{{%user}}.name', '{{%user}}.create_at', '{{%user}}.status', 'if({{%rel_user_goods}}.goods_id = '.$id.',1,0) as idsort']);
$query->joinWith('userGoods');
$count = $query->count('DISTINCT({{%user}}.id)');