在eloquent laravel中基于来自子模型的参数查询第一个模型

时间:2015-09-01 12:31:40

标签: laravel eloquent

我有2个用户表,其中包含相应的UserBUser雄辩的模型。我正在尝试查询User并仅根据BUser上的参数返回结果。

我目前正在这样做:

public function scopeMarketplace($query) {
    return $query->with(['buser' => function($q) {
        $q->where('marketplace', '=', 1);
    }]);
}

哪个会回复所有User但仅包括BUser marketplace = 1但我不想返回任何User,除非相应的BUser参数得到满足。 SQL最终成为:

select * from `users` limit 50 offset
select * from `busers` where `busers`.`id` in ('62', '63', '99', '100', '101', '102', '104', '105', '106', '107', '108', '109', '110', '111', '113', '114', '115', '116', '117', '118', '126', '128', '130', '131', '132', '142', '144', '145', '146', '147', '148', '149', '150', '151', '152', '153', '154', '155', '156', '157', '158', '159', '165', '166', '167', '168', '169', '170', '171', '172') and `marketplace` = '1'

这会获取所有User个对象,然后查询BUser - 所以返回错误的数据。

User BUser中的关系是:

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasOne
 */
public function buser()
{
    return $this->hasOne('App\BUser', 'id', 'id');
}

1 个答案:

答案 0 :(得分:2)

您正在寻找whereHas方法:

public function scopeMarketplace($query) {
    $query->whereHas('buser', function ($q) {
        $q->where('marketplace', 1);
    });
}