【问题标题】:How to get all data from a Eloquent Model with it's relations?如何从 Eloquent 模型中获取所有数据及其关系?
【发布时间】:2020-11-10 18:44:13
【问题描述】:

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

想象 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);
}

地址.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))'

有什么想法吗?

谢谢

【问题讨论】:

  • 一个公司应该有很多用户,一个用户应该至少属于一个公司。尝试在您的用户表中放置一个company_id 列,并用相应的公司 ID 填充该列。
  • 问题在于,对于我的解决方案,我实际上并不需要公司的多个用户。在我的例子中,一个用户代表一家公司。
  • 如果一个用户代表一家公司,为什么需要一个用户表和一个公司表?
  • 所以在我的例子中是两种类型的用户。一个是普通用户,第二个是代表公司的用户。这就是为什么决定将所有用户存储在一张表中,而特定用户只填写公司表@adam

标签: php laravel eloquent relationship


【解决方案1】:

问题在于,在 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);
}

地址.php

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

现在我们可以通过Company::with('user')->with('address')->get();获取所有公司列表及其用户和地址

【讨论】:

    【解决方案2】:

    您需要将 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);
    }
    

    然后在控制器

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

    【讨论】:

    • 就我而言,该公司仅由一位用户代表。所以在网站上注册用户时,他们分为普通用户和代表公司的用户。
    • 在这种情况下,只需将 hasOne 交换为 belongsTo,反之亦然;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2017-01-12
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多