如何使用 Scope select Eloquent ORM 中除(A 和 B)以外的所有行?
How to select all rows except (A and B) in Eloquent ORM using Scope?
我正在尝试弄清楚如何在 Eloquent 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');
}
这里我如何获取除(友谊和已发送)范围之外的用户的所有通知。
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
添加第二个参数(AND
或 OR
的 where:
来获得更多控制权
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();
我正在尝试弄清楚如何在 Eloquent 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');
}
这里我如何获取除(友谊和已发送)范围之外的用户的所有通知。
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
添加第二个参数(AND
或 OR
的 where:
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();