我有三个表:User
,Client
,Position
。工作流程如下:
client
创建自己的positions
集。 client
将users
添加到其管理中,然后将positions
分配给他们user
可以属于多个不同的clients
。所以这些表之间的关系是:
Client
至Position
:一对多Position
至User
:多对多Client
至User
:多对多目前,我的模型如下:
Class User extends Eloquent {
public function clients()
{
return $this->belongsToMany('Client');
}
public function positions()
{
return $this->belongsToMany('Position');
}
}
Class Client extends Eloquent {
public function users()
{
return $this->belongsToMany('User');
}
public function positions()
{
return $this->hasMany('Position');
}
}
// The Position model is not included, since it doesn't make sense to start from a position
因此,假设User
属于两个Clients
,并且每个Positions
都有不同的Clients
。一个例子是:
我只想让迈克在微软的职位。现在,我知道如何做到这一点的唯一方法如下:
$c_id = $Microsoft_Id;
$u_id = $Mike_Id;
Client::find($c_id)
->users()
->whereId($u_id)
->with(['positions' => function($query) use ($c_id)
{
$query->whereClientId($c_id);
}
])
->get();
我有可能在模型中执行此任务吗?如果我只是说:
,这会更直观Client::find($c_id)
->users()
->whereId($u_id)
->with('positions')
->get();
检查在模型本身内进行。
答案 0 :(得分:0)
您可以使用此功能,但在预先加载时无法正常工作,因为显然$id
无法访问:
// Client model
public function usersWithPositions()
{
$id = $this->getKey();
return $this->belongsToMany('User')->with(['positions' => function ($q) use ($id) {
$q->whereClientId($id);
}]);
}
// will work
$client = Client::find($c_id);
$client->usersWithPositions;
// or
$Mike = $client->usersWithPositions()->where('users.id', $u_id)->first();
// won't work
Client::with('usersWithPositions')->get();
您可以对此方法添加检查,因此它不会抛出异常,但仍然无法使用预先加载。