【问题标题】:Return a one to one relationship instance when database is many to many数据库多对多时返回一对一关系实例
【发布时间】:2019-05-25 02:05:41
【问题描述】:

我在数据库中有一个多对多关系,看起来像 用户 -> user_companies -> 公司。

我的问题是,就我们的业务逻辑而言,这应该是一对一的关系,但纠正这将需要大量工作。在数据透视表中,用户只有一个条目。

目前在用户模型上我正在这样做,但它返回一个模型而不是关系实例。

// returns relationship instance
public function companies()
{
    return $this->belongsToMany('App/Company', 'user_companies');
}

// returns model
public function company()
{
    return $this->companies()->first();
}

当数据库设置为多对多时,我是否可以模仿一对一关系的行为?

更新:

Laravel 现在添加了一个开箱即用的 HasOneThrough 关系。 https://laravel.com/docs/5.8/eloquent-relationships#has-one-through

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    有了这个,这是可能的,但你真的必须深入挖掘核心并构建你自己的自定义解决方案(关系查询生成器)。

    首先想到的是hasOneThrough关系方法。不幸的是,这不是开箱即用的。我的建议是找到一个可靠的软件包来实现这一点。

    其实我能找到这个包:https://github.com/riesjart/relaquent

    否则,除非您的 DB Schema 完全一团糟,否则将 company_id 添加到您的 users 表中,然后编写 sql 迁移脚本一点也不复杂。希望这会有所帮助。

    【讨论】:

    • 谢谢马特,我去看看。不幸的是,我们的应用程序足够大且足够老,以至于我们混合了查询构建器和 eloquent,因此修复关系意味着我们也必须修复很多查询! hasOneThrough 是个好主意,我会深入研究。
    • @hdifen 你会看吗,Laravel 刚刚在 Laravel 5.8 中实现了 hasOneThrough 功能
    • 是啊哈哈。我们已经将它放入我们的代码库:)。我将更新我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2012-09-29
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2012-11-26
    • 2019-07-24
    相关资源
    最近更新 更多