📜  没有类名的 morph laravel - PHP (1)

📅  最后修改于: 2023-12-03 15:11:04.416000             🧑  作者: Mango

没有类名的 morph laravel - PHP

概述

在 Laravel 中,morph 方法可以帮助我们对一个模型进行多态关联。当我们使用 morph 方法时,需要传递关联模型的类型和 ID 值,以便 Laravel 知道照顾哪个模型的关联关系。

然而,在某些情况下,你可能不知道它们的类型或 ID 值,或者你可能需要增强灵活性以支持更多的关联。这时,你可以使用“没有类名”的多态关联,使你可以轻松地处理任何关联类型!

如何实现

首先,我们需要使用 Laravel 提供的 morphTo 关联方法对我们的模型进行设置:

class Comment extends Model
{
    /**
     * Get the owning commentable model.
     */
    public function commentable()
    {
        return $this->morphTo();
    }
}

接下来,我们需要在数据库中添加一个新的字段,用于存储关联模型的类型:

Schema::create('comments', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('commentable_id');
    $table->string('commentable_type'); // 新增类型字段
    $table->text('body');
    $table->timestamps();
});

然后,我们需要更新模型的数据,以便在关联时使用“没有类名”的多态关联:

class Comment extends Model
{
    /**
     * Get the owning commentable model.
     */
    public function commentable()
    {
        return $this->morphTo('commentable', 'commentable_type', 'commentable_id'); // 指定没有类名的多态关联
    }
}
使用示例

如果您需要获取评论的关联模型,请使用以下方法:

$comment = Comment::find(1);
$commentable = $comment->commentable;

如果关联不存在,将返回 null 值。

如果您需要设置评论的关联模型,您可以使用以下方法:

$comment = new Comment(['body' => 'A new comment.']);

$post = Post::find(1);
$post->comments()->save($comment, ['commentable_type' => 'post']);

在此示例中,我们手动指定了要存储的关联类型。这使我们可以轻松地创建多态关联,无需预定义所有可能的关联类型。

总结

没有类名的多态关联是一种增强灵活性的方法,可以让您更容易地处理不确定的关联类型。虽然这种方法可能会增加您的开发时间,但它可以帮助您创建更加普适和稳健的代码。