Laravel:模型中的动态关系

Posted

技术标签:

【中文标题】Laravel:模型中的动态关系【英文标题】:Laravel: Dynamic Relationship in Model 【发布时间】:2016-11-04 11:15:31 【问题描述】:

我的内容模型具有动态关系。我使用内容模型作为我的帖子类型,并且它们在数据库中的每一个都有一个模型值,该模型值重定向到一个模型,该模型是内容类型的实际内容,以后可能会使用作曲家包安装。

public function contents() 
        return $this->hasMany($this->model);
    

当我在我的视图中使用这种关系时它会起作用

$type->contents

但是当我想在我的控制器中预先加载这种关系时;

$types = Content::with('contents')->get();

我得到了错误

FatalThrowableError in Model.php line 844: Class name must be a valid object or a string

我还没有弄清楚为什么这不起作用,也没有想到其他方法可以实现同样的目标。如果不清楚,我可以提供更多细节。提前致谢!

UPDATE(我想出的临时/永久解决方案) 我删除了关系并用这个替换它;

public function getContentsAttribute() 
         $items = $this->contents_type::with('user')->get();
         return $items;
    

【问题讨论】:

您是否尝试过使用 FQN,即: public function contents() return $this->hasMany('App\Models\Content'); 是的,如果我只有一种类型的内容,这可以工作,目前我的内容类型是页面和帖子。它们在内容表上分别用模型值 Socms\Content\Page 和 Socms\Content\Post 表示。 -> i.imgur.com/ByE2pT5.png 试试这个return $this->hasMany(self::$modelClass); 将参数设为静态!不要忘记设置$modelClass 伊斯梅尔,我不确定你的意思。 【参考方案1】:

如果我正确理解您的问题,您的 contents 表是多态的,如果还没有,应该同时具有 foreign_idforeign_type(可以替换为 content_idcontent_type )。然后在您的内容模型中,您应该有以下代码:

public function contents()

    return $this->morphTo();

【讨论】:

您好,谢谢您的回答,我已经尝试过了。这不正是我正在寻找的,因为 $type->contents 现在将尝试返回带有我不想指定的 foreign_id 的 foreign_type。我希望它返回属于一个类的所有行,而不必指定foreign_id。 我已经用我的临时解决方案编辑了我的问题 抱歉误会。我认为您的解决方案在我看来相当不错。【参考方案2】:

(我想出的临时/永久解决方案) 我删除了关系并用它替换它;

public function getContentsAttribute() 
         $items = $this->contents_type::with('user')->get();
         return $items;
    

【讨论】:

以上是关于Laravel:模型中的动态关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eager Loading 和动态绑定模型关系

Laravel eloquent 如何动态创建关系?

模型中的 Laravel 动态可填充

Laravel - 从刀片视图中的模型关系中检索属性

如何从 hasManyThrough 雄辩关系返回 Laravel 中的单个模型

如何通过 Laravel 中的多对多关系获取模型