Laravel 5.4 hasManyThrough返回错误的查询

时间:2018-11-15 16:35:12

标签: php laravel

我在Seller模型中遵循以下关系

public function members()
{
    return $this->hasManyThrough(Member::class, Organization::class, 'seller_id', 'organization_id', 'id');
}

表结构:

卖家

  • id

seller_organizations

  • seller_id
  • organization_id

组织

  • id

organization_members

  • id
  • organization_id

卖方有很多组织,而一个组织有很多成员。

在我的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 = idorganization_members,其中organization_idorganizations = 123)

我如何告诉laravel需要在Seller_organizations表中查找正确的关系?

提前谢谢!

3 个答案:

答案 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)

似乎SellerOrganization建立了多对多关系,因此在这种情况下,您不能应用Has Many Through,因为它是两个的并集同一方向上的一对多关系,例如:

|A| has many |B|
|B| has many |c|

因此,在执行查询时,它遵循以下逻辑:

|A| has many |C| through |B|.

您可以定义自己的关系,请检查this答案。只需记住用->lists()来更改->pluck(...)