【问题标题】:Conditional table joins条件表连接
【发布时间】:2015-12-17 01:19:40
【问题描述】:

我的 eloquent 模型中有以下范围,我想向它添加两个条件。我需要帮助。

public function scopeImages($query) {
    $query->join('images as i', function ($join) {
        $join->on('i.vessel_id', '=', 'vessel.id')
        ->where('i.sort', '=', 'min(i.sort)');
    })
    ->leftjoin('users', 'users.id', '=', 'vessel.user_id')
    ->select('vessel.*', 'i.image as image', 'users.name as brokername');
}

images 表有 featuredsort 列。我想选择返回结果中images.featured is 1min sort 所在的一行。如果没有images.featured=1,那么我想选择min of sort

目前上述范围为每个vessel_id选择min sort的图像

【问题讨论】:

  • 你想最后一行,还是每张图片一行?
  • @Chris 每艘船一排

标签: laravel join laravel-5 eloquent laravel-5.1


【解决方案1】:

你需要一个相关的子查询

https://dev.mysql.com/doc/refman/5.5/en/correlated-subqueries.html

    SELECT  v.*, 
(SELECT `image` FROM images WHERE vessel_id = v.id ORDER BY featured DESC, sort LIMIT 1) AS image
    FROM `vessel` AS v

@编辑 你可以试试这个:

public function scopeImages($query) {
    return $query
        ->leftjoin('users', 'users.id', '=', 'vessel.user_id')
        ->select(\DB::raw("vessel.*, (SELECT `image` FROM images WHERE vessel_id = vessel.id ORDER BY featured DESC, sort LIMIT 1) AS image, users.name as brokername"));
} 

【讨论】:

  • 谢谢@ad4s 我想用 Laravel Eloquent 写这篇文章。
  • 我编辑了我的答案。我没有在框架中测试这个。它也是快速和肮脏的。有时这是最后的手段,但我可以忍受它;)
【解决方案2】:

如果您在 desc 中按特征(如果特征是布尔值)排序并在 asc 中排序,它将以最高优先级列出特征 1,然后从 min 到 max 列出排序。现在,如果你占据第一排,你会得到你想要的。

$query->join('images', 'images.vessel_id', '=', 'vessel.id')
        ->leftjoin('users', 'users.id' ,'=', 'vessel.user_id')
        ->select('vessel.*', 'images.image as image', 'users.name as brokername')
        ->orderBy('images.featured', 'DESC')
        ->orderBy('images.sort', 'ASC')
        ->take(1);

【讨论】:

猜你喜欢
  • 2016-12-19
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2021-09-04
  • 2013-08-13
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多