Laravel中的HasManyThrough关系使用非标准外键

时间:2015-09-25 09:42:56

标签: laravel foreign-keys eloquent

在我的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');
}

这不起作用。原因是ContractAccount之间的关系由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);这几乎同样优雅,但由于急切加载帐户以及列表操作,可能性能稍差。

让关系正常工作仍然是可取的。

0 个答案:

没有答案