我在Seller
模型中遵循以下关系
public function members()
{
return $this->hasManyThrough(Member::class, Organization::class, 'seller_id', 'organization_id', 'id');
}
表结构:
卖家
seller_organizations
组织
organization_members
卖方有很多组织,而一个组织有很多成员。
在我的Seller \ MemberController中,我想像这样解析查询
private function parseRequest(Request $request, Seller $seller)
{
$query = $seller->organizationMembers();
}
响应:
SQLSTATE [42S22]:找不到列:1054“ where子句”中的未知列“ organizations.seller_id”(SQL:从
organization_members
内部连接organizations
的{ {1}}。organizations
=id
。organization_members
,其中organization_id
。organizations
= 123)
我如何告诉laravel需要在Seller_organizations表中查找正确的关系?
提前谢谢!
答案 0 :(得分:1)
您的特殊情况不同于Laravel开箱即用的通用解决方案。在belongsToMany
模型的Seller
上创建organizations
关系
像这样:
public function organizations()
{
return $this->belongsToMany(Organization::class, 'seller_organizations', 'seller_id', 'organization_id');
}
在organization
模型上,添加一个hasMany
members
关系,如下所示:
public function organizationMembers()
{
return $this->hasMany(OrganizationMember::class);
}
然后最后在Seller
模型中,按如下所示添加members
关系:
public function members()
{
$members= new Illuminate\Database\Eloquent\Collection;
foreach($this->organizations as $organization)
{
$members = $members->merge($organization->organizationMembers->get());
}
return $members->unique();
}
答案 1 :(得分:1)
您可以使用以下简单查询来构建函数:
class Seller
{
public function organizationMembers()
{
return OrganizationMember::query()
->whereHas('organization', function ($query) {
$query->whereHas('sellers', function ($query) {
$query->where('id', $this->id);
});
});
}
}
但是您将无法使用内置的关系类型。因此,在这种情况下,急切的加载将对您不可用。
答案 2 :(得分:0)
似乎Seller
和Organization
建立了多对多关系,因此在这种情况下,您不能应用Has Many Through,因为它是两个的并集同一方向上的一对多关系,例如:
|A| has many |B|
|B| has many |c|
因此,在执行查询时,它遵循以下逻辑:
|A| has many |C| through |B|.
您可以定义自己的关系,请检查this答案。只需记住用->lists()
来更改->pluck(...)
。