如何在 Laravel 中对所有行使用多态关系?

Posted

技术标签:

【中文标题】如何在 Laravel 中对所有行使用多态关系?【英文标题】:How to use Polymorphic Relations in Laravel with all rows? 【发布时间】:2017-07-12 15:39:36 【问题描述】:

我是 Laravel 新手,我使用的是 laravel 5.4 版本。 我有下一个场景:我有一个用户表,我只输入用户名和密码,还有另外两个表员工和合作伙伴,我保存用户的所有数据,如姓名、地址、电子邮件、电话......

表结构:

用户 - id|用户名|密码|userable_id|userable_type 员工 - id|name|phone|email|salary|position|departamnet 合作伙伴 - id|名称|公司名称

In User model:
class User extends Authenticatable

        public function userable()
        return $this->morphTo();
    


Class Model:
    class Employee extends Model
    
        protected $fillable = [];
        public function users()
        
            return $this->morphOne('App\User', 'userable');
        
    
Partner Model:
class Partner extends Model

    protected $fillable = [];
    public function users()
    
        return $this->morphOne('App\User', 'userable');
    

现在,如果我在 tinker 中执行此 (App\User::first()->userable ),将只为第一个用户返回来自 Employee/Partner 的数据。 for all() 或 get() 方法将返回:

App\User::all()->用户可用 消息“此集合实例上不存在属性 [userable]”的异常。 应用\用户::get()-> 用户可用 消息“此集合实例上不存在属性 [userable]”的异常。

让它适用于所有用户列表有什么改变吗? PS:在 userable_type 上的 users 表中,我有一个模型,而在 userable_id 上,我有与模型对应的行 id,例如 Employee 和 1。提前致谢。

【问题讨论】:

【参考方案1】:

我相信,由于您正在获取所有用户的集合,问题是您需要急切加载关系才能获得所需的内容

App\User::with('userable')->get();

我不在我的工作站测试这个自动取款机,但如果记忆对我有用,那应该可以工作。当我可以测试它时,我会更新它

【讨论】:

谢谢!我之前只在代码中尝试过这个,而不是在 Tinker 中。在看到 tinker 的响应后,我意识到代码有问题...

以上是关于如何在 Laravel 中对所有行使用多态关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Eloquent 建立多态关系

检索多态关系 laravel 的所有者

如何在 Laravel 中使用具有多态关系的“group by”?

laravel 关联模型 多态关系

如何最好地链接到 Laravel 中的多态关系

Laravel 5 检索所有多态模型的最佳方法