获取除已经相关的任何模型之外的所有行

时间:2016-12-09 15:59:02

标签: php laravel collections laravel-5

所以我在Laravel 5.3中有2个模型。 PracticeOffer,他们有多对多的关系,这些关系已经建立并正常运作。我可以将提议附加到练习等。我想要检索所有与练习无关的优惠。

登录用户也属于practice_id的练习。

在我的控制器中,我在$offer中传递了与所有商品相关的构造函数。我已经尝试使用reject()方法,但我没有得到任何回报,我无法弄明白。

如果我使用$this->offer,我会得到所有内容。

$query = $this->offer->reject(function($offer){
    return $offer->whereHas('practices', function($q) {
        return $q->where('practice_id', Auth::user()->practice_id);
    });
});

Releations

用户模型

public function practice()
{
    return $this->belongsTo(Practice::class);
}

练习模型

public function users()
{
    return $this->hasMany(User::class, 'practice_id');
}

public function offers()
{
    return $this->belongsToMany(Offer::class, 'offer_practice')->withTimestamps();
}

优惠模式

public function practices()
{
    return $this->belongsToMany(Practice::class, 'offer_practice')->withTimestamps();
}

请帮忙。

2 个答案:

答案 0 :(得分:1)

您可以像这样使用whereHas

此查询为您提供与那些与经过身份验证的用户有关系的实践无关的优惠。

$offers = Offer::whereHas('practices', function($q) {
    $q->where('id', '<>', auth()->user()->practice->id);
});

<强>更新

然而,以下查询会为您提供与那些与数据库中任何用户有关系的实践无关的优惠。

$practice_id_arr = Practice::has('users')->pluck('id')->all();

$offers = Offer::whereHas('practices', function($q) use($practice_id_arr) {
    $q->whereNotIn('id', $practice_id_arr);
});

以下查询为您提供与任何做法无关的优惠:

$offers = Offer::doesntHave('practices')->get();

以下查询为您提供与所有做法相关的优惠:

$offers = Offer::has('practices')->get();

希望这有帮助!

答案 1 :(得分:1)

我已经设法在@SaumyaRastogi的帮助下将其解决为一个小问题。

$offers = $this->offer->whereHas('practices', function($q) {
    $q->where('practice_id', '<>', auth()->user()->practice->id);
})->orHas('practices', '<', 1)->get();