【问题标题】:multiple joins with the same table in eloquent雄辩中同一张表的多个连接
【发布时间】:2018-07-18 23:14:34
【问题描述】:

是否有一些优雅的方式可以用 eloquent 编写以下查询?我想避免使用原始查询:

results(id, data)
result_filters (id, result_id, filter_id, value)

SELECT * FROM results, result_filters as age, result_filters as followers
WHERE age.result_id = results.id
AND followers.result_id = results.id
AND age.filter_id = 2
AND age.value > 90
AND followers.filter_id = 6
AND followers.value < 10000

【问题讨论】:

  • 你能分享一下这个模型之间的关系,即results和result_filters吗?
  • @PrashantPrajapati result_filters 通过 result_filters.resultid = results.id 引用结果

标签: sql laravel eloquent


【解决方案1】:

如果你使用的是 laravel eloquent 你的模型关系可能是这样的

模型结果:

public function resultFilters()
    {
        return $this->hasMany('App\ResultFilter');
    }

模型结果过滤器:

public function result()
    {
        return $this->belongsTo('App\Result','result_id');
    }

试试下面的代码:

$result = Result::find(1);
$data = $result->resultFilter()
            ->whereIn('filter_id',[2,6])
            ->whereBetween('value',[90,10000])
            ->get();

【讨论】:

  • 我认为这将等于 (filter_id = 2 OR filter_id = 6) AND value > 90 AND value 90
  • 它将返回 filter_id = 2 AND filter_id = 6 AND 值介于 90 和 10000 之间的集合
  • 但我希望 filter_id 2 的值 > 90 和 filter_id 6 的值
【解决方案2】:

你怎么看?它使用 DB::raw 但它可以工作

$data = DB::table(DB::raw("results, result_filters as age, result_filters as followers "))
->select(DB::raw("* "))
->where('age.result_id', 'results.id')
->where('followers.result_id', 'results.id')
->where('age.filter_id', 2)
->where('age.value', '<', 90)
->where('followers.filter_id',6)
->where('followers.value','<',10000)
->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 2020-05-08
    • 2014-07-01
    • 2018-06-03
    • 1970-01-01
    • 2019-06-09
    • 2018-02-10
    • 2022-01-15
    相关资源
    最近更新 更多