数据库
首页 > 数据库> > 首页> MySQL的>如何使用范围选择雄辩的ORM中除(A和B)以外的所有行?

首页> MySQL的>如何使用范围选择雄辩的ORM中除(A和B)以外的所有行?

作者:互联网

我试图弄清楚如何在雄辩的ORM模态中获取除几行(A和B)以外的所有行.

用户模型

public function notifications()
{
    return $this->hasMany('notification','listener_id','id');
}

型号通知

public function scopeFriendship($query)
{
    return $query->where('object_type', '=', 'Friendship Request');
}

public function scopeSent($query)
{
    return $query->where('verb', '=', 'sent');
}

在这里,我如何获取除(Friendship and Sent)范围以外的所有用户通知.

Something like:- all rows except !(Friendship AND Sent)

解决方法:

可以将示波器与预先加载结合使用.像那样:

User::with(['notifications' => function($q){
    $q->friendship();
}])->get();

但是,我们现在需要以某种方式反转范围.我可以想到两种解决方法.

1.添加否定范围

public function scopeNotFriendship($query){
    return $query->where('object_type', '!=', 'Friendship Request');
}

public function scopeNotSent($query){
    return $query->where('verb', '!=', 'sent');
}

User::with(['notifications' => function($q){
    $q->notFriendship();
    $q->notSent();
}])->get();

2.可选参数

或者,您可以在当前范围内引入一个可选参数.像这样:

public function scopeFriendship($query, $is = true)
{
    return $query->where('object_type', ($is ? '=' : '!='), 'Friendship Request');
}

public function scopeSent($query, $is = true)
{
    return $query->where('verb', ($is ? '=' : '!='), 'sent');
}

这样,您只需要传递false即可:

User::with(['notifications' => function($q){
    $q->friendship(false);
    $q->sent(false);
}])->get();

编辑

您甚至可以通过为boolean(where的AND或OR)添加第二个参数来获得更多控制权:

public function scopeFriendship($query, $is = true, $boolean = 'and')
{
    return $query->where('object_type', ($is ? '=' : '!='), 'Friendship Request', $boolean);
}

如果您希望任一范围都为真:

$q->friendship(true, 'or');
$q->sent(true, 'or');

第二次编辑

终于成功了(通过聊天)

Notification::where('listener_id', $user_id) 
    ->where(function($q){ 
        $q->friendship(false) 
        $q->sent(false, 'or') 
    }) 
    ->get();

标签:laravel,eloquent,laravel-4,mysql
来源: https://codeday.me/bug/20191120/2047221.html