📅  最后修改于: 2023-12-03 15:11:04.416000             🧑  作者: Mango
在 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']);
在此示例中,我们手动指定了要存储的关联类型。这使我们可以轻松地创建多态关联,无需预定义所有可能的关联类型。
没有类名的多态关联是一种增强灵活性的方法,可以让您更容易地处理不确定的关联类型。虽然这种方法可能会增加您的开发时间,但它可以帮助您创建更加普适和稳健的代码。