【问题标题】:Making subqueries on eloquent LARAVEL 5.2.29在 eloquent LARAVEL 5.2.29 上进行子查询
【发布时间】:2018-03-16 00:32:48
【问题描述】:

我正在尝试从关系中包含空列的选择中排除一些记录。

这是我希望实现的查询:

SELECT 
FROM modelas ma WHERE
  ma.id NOT IN (SELECT ma_id from modelbs where modelbs.updated_at is null)

模型 A:

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

模型 B

public function modela(){
return $this->belongsTo('App\Modela');
}

现在,我想查询具有模型 B 的所有模型 A,其中模型 B 的某个列不为空。

这是我的尝试:

Modela::whereHas('modelbs', function ($query) {
            $query->whereNotNull('myColumnOfModelB');
        })->get();

这正好给了我想要从我的选择中排除的记录

【问题讨论】:

  • 除了一些不一致(你的关系是modelb,但你调用whereHas('modelbs')和一个语法错误(你有2个))在最后),这似乎是正确的。你确定您的关系按您的意愿运作?
  • 我称它为 modelbs 是因为 eloquent 将每个表名都复数了。关系运作良好。我实际上发现了我错在哪里。我会用正确的查询来回答我自己的问题。

标签: php mysql laravel eloquent subquery


【解决方案1】:

嗯,我能够找出我错在哪里了。所以这是一个实现原始 sql 的查询:

Modela::whereDoesntHave('modelbs', function ($query) {
            $query->whereNull('someModelBcolumn');
        })->get()

原始 SQL

SELECT 
FROM modelas ma WHERE
  ma.id NOT IN (SELECT ma_id from modelbs where modelbs.updated_at is null)

"whereDoesntHave()" 等价于 "SELECT FROM modelas ma WHERE ma.id NOT IN" 而 "$query->whereNull( )" 是等效于“(SELECT ma_id from modelbs where modelbs.updated_at IS NULL)”的实际子查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2019-07-21
    相关资源
    最近更新 更多