如何从雄辩模型及其关系中获取所有数据?

时间:2020-11-10 18:44:13

标签: php laravel eloquent relationship

我的问题是如何从雄辩的模型及其关系中获取数据?

想象一下3张桌子:

用户

| id | name | email           |
|----|------|-----------------|
| 1  | name | email@email.com |

公司

| id | name | user_id | address_id |
|----|------|---------|------------|
| 1  | name | 1       | 1          |

地址

| id | zip    | state |
|----|--------|-------|
| 1  | 101010 | LA    |

与关系:

Company.php

public function user()
{
    return $this->hasOne(User::class);
}

public function address()
{
    return $this->hasOne(Address::class);
}

User.php

public function company()
{
    return $this->belongsTo(Company::class);
}

Address.php

public function company()
{
    return $this->belongsTo(Company::class);
}

在这种情况下,我如何获得所有拥有相关用户和地址的公司?

Company::whereHas('users')->get();上获得:

Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.company_id' in 'where clause' (SQL: select * from `users` where `users`.`company_id` in (1, 2, 3, 4, 5))'

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:0)

您需要将hasOne与BelongsTo交换,反之亦然;

Company.php

public function users()
{
    return $this->belongsTo(User::class, 'user_id');
}

public function address()
{
    return $this->belongsTo(Address::class);
}

User.php

public function company()
{
    return $this->hasOne(Company::class);
}

地址

public function company()
{
    return $this->hasOne(Company::class);
}

,然后在 Controller

Company::whereHas('users')
    ->whereHas('address')
    ->with('users')->with('address')
    ->get();

答案 1 :(得分:0)

问题在于,在 company 模型中,用户和地址方法使用hasOne()方法引用其他模型。它正在寻找要在用户表中而不是公司中使用的辅助密钥。

只需将hasOne()换成belongsTo就可以解决我的问题。

所以现在我的 Company.php 模型如下:

public function user()
{
    return $this->belongsTo(User::class);
}

public function address()
{
    return $this->belongsTo(Address::class);
}

User.php

public function company()
{
    return $this->hasOne(Company::class);
}

Address.php

public function company()
{
    return $this->hasOne(Company::class);
}

现在我们可以通过Company::with('user')->with('address')->get();

来获得所有公司及其用户和地址的列表。