【问题标题】:Laravel class isn't in polymorphic relationship with other classLaravel 类与其他类没有多态关系
【发布时间】:2019-12-12 06:14:42
【问题描述】:

我正在我的小项目中处理这些类之间的多态关系:提交(与帖子相同)、评论和用户。

问题是,我可以依靠提交模型收集所有的 cmets,例如:

$submissions = Submission::with('comments')->get()->find( $submission );

但是,如果我在修补程序中尝试这样的事情:

$users = User::with( 'comments' )->get();

我得到了所有的用户数据,但没有 cmets 出现:

         comments: Illuminate\Database\Eloquent\Collection {#3003
           all: [],
         },

这是模型之间关系的所有代码:

class Comment extends Model
{
    protected $fillable = [ 'commentable_id', 'commentable_type', 'text' ];

    public function commentable() {
        return morphTo();
    }
}

现在这被添加到提交和用户模型中:

    public function comments() {
        return $this->morphMany( Comment::class, 'commentable' );
    }

在提交模型中,我使用受保护的 $guarded = [];处理批量分配,我不在用户模型中调用它。

我希望你能告诉我我做错了什么,因为我无法通过评论模型访问用户模型,反之亦然。 提前致谢!

编辑:这是创建评论的代码:

    public function store( Submission $submission ) {

        $data = request()->validate([
           'text' => [ 'required', 'string', 'max:255' ]
        ]);

        $id = $submission->comments()->create([ 'text' => request()->text ]);
        dd( $submission, $data );

    }

【问题讨论】:

  • 对我来说一切都很好。您实际上在commentable_typeApp\User 的db 中有任何cmets?您创建评论的代码仅用于提交 cmets。
  • 其实这可能是个问题。我有几个创建的 cmets 和 commentable_type 是 Submission::class,而不是 User::class 因为我没有找到添加两者的方法,但在这种情况下我需要它们,你能给我一个提示如何为用户和提交创建评论?在此先感谢:)

标签: laravel eloquent polymorphic-associations


【解决方案1】:

关系morphMany 是一对多关系,如hasMany。所以一个评论可以属于提交或用户,而不是两者。一种选择是为提交和用户创建单独的 cmets(用户执行与提交 $user->comments()->->create([...]) 相同的操作)。第二种选择是使用many-to-many polymorphic relation,其中一条评论可以属于多个提交和用户。

【讨论】:

  • 谢谢,现在我已经和用户建立了关系,但问题是我创建评论的方式:$id = auth()->user()->comments()->create( $data );如果我调用上面的代码,我只能通过用户模型访问评论,如果我使用这个:$submission->comments()->create( $data ); 我只能通过提交模型访问评论。你能告诉我如何让它们对提交和用户模型都可用吗?
  • 是的,您可以使用morphToMany 来完成。在我的答案中的链接中查看如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多