Laravel 存在多对多的模型关系
Laravel Model Relation Where Many-to-Many Exists
考虑以下关系结构(使用 Laravel Eloquent 关系):
Assessment --> belongsToMany --> Users
Assessment --> hasMany --> Action Item
Action Item --> belongsToMany --> Users
实际上,这意味着可以将单个评估分配给许多不同的用户,然后一旦创建了操作项,就可以将该项目分配给任何或所有这些用户。
目前,我在评估和操作项之间有一个 Eloquent 关系 - hasMany
。很简单。但是,如果我可以创建 两个 附加关系将是理想的:assignedActionItems
和 unassignedActionItems
。换句话说,一个 return 个与用户之间的关系为空的操作项,另一个 return 个不存在的操作项。
简而言之,这样的关系可能吗?
public function assignedActionItems() {
return $this->hasMany('App\Entities\ActionItem')
->where( ** ACTIONITEM->USERS IS NOT EMPTY ** );
}
public function unassignedActionItems() {
return $this->hasMany('App\Entities\ActionItem')
->where( ** ACTIONITEM->USERS IS EMPTY ** );
}
如果是,怎么办?
我已经通过 $appends
属性实现了它,但如果我能将它写成实际关系,它会感觉更干净并且能够延迟加载等。
听起来您应该能够检查关系是否存在,而不是定义新关系。
来自https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-existence:
// Retrieve all action items that have been assigned to at least one user ...
$actionItems = App\ActionItem::has('assigned')->get();
您还可以通过添加所需计数或其他 where
条件来进一步缩小查询范围。
考虑以下关系结构(使用 Laravel Eloquent 关系):
Assessment --> belongsToMany --> Users
Assessment --> hasMany --> Action Item
Action Item --> belongsToMany --> Users
实际上,这意味着可以将单个评估分配给许多不同的用户,然后一旦创建了操作项,就可以将该项目分配给任何或所有这些用户。
目前,我在评估和操作项之间有一个 Eloquent 关系 - hasMany
。很简单。但是,如果我可以创建 两个 附加关系将是理想的:assignedActionItems
和 unassignedActionItems
。换句话说,一个 return 个与用户之间的关系为空的操作项,另一个 return 个不存在的操作项。
简而言之,这样的关系可能吗?
public function assignedActionItems() {
return $this->hasMany('App\Entities\ActionItem')
->where( ** ACTIONITEM->USERS IS NOT EMPTY ** );
}
public function unassignedActionItems() {
return $this->hasMany('App\Entities\ActionItem')
->where( ** ACTIONITEM->USERS IS EMPTY ** );
}
如果是,怎么办?
我已经通过 $appends
属性实现了它,但如果我能将它写成实际关系,它会感觉更干净并且能够延迟加载等。
听起来您应该能够检查关系是否存在,而不是定义新关系。
来自https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-existence:
// Retrieve all action items that have been assigned to at least one user ...
$actionItems = App\ActionItem::has('assigned')->get();
您还可以通过添加所需计数或其他 where
条件来进一步缩小查询范围。