【问题标题】:Laravel: Dynamic Relationship in ModelLaravel:模型中的动态关系
【发布时间】: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
  • 伊斯梅尔,我不确定你的意思。

标签: php laravel eloquent relationship eager-loading


【解决方案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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多