在我的Laravel应用程序中,我有以下架构(和相应的模型):
clients
id - integer (primary)
name - string
accounts
id - integer (primary)
account_id - string (unique)
client_id - integer (foreign, references id on clients)
name - string
contracts
id - integer (primary)
account_id - string (foreign, references account_id on accounts)
title - string
我想要一个hasManyThrough
关系,这样我就可以获得给定客户的所有合同,因此我在Client
模型中定义关系:
public function contracts()
{
return $this->hasManyThrough('Contract', 'Account', 'client_id', 'account_id');
}
这不起作用。原因是Contract
和Account
之间的关系由contracts.account_id = account.account_id
加入(不 contracts.account_id = account.id
)。
这是一种非传统的关系,对于应用程序的结构是必要的。但是,似乎没有办法在中间模型上定义连接键。
有没有办法解决这个问题,还是我需要自己构建查询?
更新
目前,我解决这个问题的方法是使用查询范围。在我的Contract
模型上,我添加了以下内容:
public function scopeForClient($query, Client $client)
{
return $query->whereIn('account_id', $client->accounts->lists('account_id'));
}
这允许我做Contract::forClient($client);
这几乎同样优雅,但由于急切加载帐户以及列表操作,可能性能稍差。
让关系正常工作仍然是可取的。