【问题标题】:Eloquent how to join/relate a table that has been connected via model?Eloquent 如何加入/关联已通过模型连接的表?
【发布时间】:2020-02-11 12:30:50
【问题描述】:

我可能用错了措辞,但这是我试图弄清楚的内容的概要。

现在我有三个模型,User.php、Company.php 和 UserCompanies.php。基本上,我的用户表中的每个用户都有一个公司,来自公司表,它们通过我的 usercompanies 表链接,该表包含 user_id 和 company_id。在我的 UserCompanies.php 模型中,我喜欢这个,

class UserCompanies extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];
    /*
    |--------------------------------------------------------------------------
    | Use a centralized auth DB
    |--------------------------------------------------------------------------
    */

    protected $connection = 'mysqlauth';

    protected $table = 'user_companies';

    protected $fillable = [
        'user_id', 'company_id', 'status',
    ];

    /**
     * Get the user that owns the usercompanies.
     */
    public function user()
    {
        return $this->belongsTo(User::class)->withTrashed();
    }

    /**
     * Get the company
     */
    public function company()
    {
        return $this->belongsTo(Company::class)->withTrashed();
    }
}

现在只需在我的控制器中说,我需要传递具有用户和公司的数据,我该怎么做?

/App/User::where('status', 'A')->get();
/App/Companies::where('status', 'A')->get();

//我如何处理 UserCompanies,如何在不使用 foreach 循环的情况下将其链接在一起?

【问题讨论】:

  • 用户和公司是什么关系?
  • 基本上,一个公司可以有很多用户,但一个用户只有1个公司。所以在 user 表中,我们不存储 company_id,因此我们使用 user_companies 表。 user_companies 表,存储 user_id 和 company_id
  • 为什么不把 company_id 放在用户表中。关系只是一对多
  • 建db结构的不是我哈哈。现在添加这种关系有点太晚了,因为我们现在有超过数万行..
  • 也许你可以改成:一个用户有一个user_companies,一个公司有很多user_companies。

标签: laravel eloquent


【解决方案1】:

对我来说,像 UserCompanies 这样的数据透视表有一个模型是荒谬的。如果它除了关系之外没有任何其他目的。请不要这样做。

假设我们定义了 User 和 Company 模型中的关系:

class User extends Model
{
    public function companies()
    {
        return $this->belongsToMany(Company::class, 'user_companies')
    }
}

class Company extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'user_companies')
    }
}

然后您可以使用这些条件获得您想要的用户和公司:

User::whereHas('companies', function ($query) {
    $query->wherePivot('status', 'A');
})

Company::whereHas('users', function ($query) {
    $query->wherePivot('status', 'A');
})

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 2015-05-23
    • 2018-12-05
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多