📜  laravel 将模型添加到多态关系 - PHP (1)

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

Laravel 将模型添加到多态关系

在 Laravel 中,多态关系允许一个模型属于多个不同类型的模型。这种关系常见于一对多关联中的多个模型类型,比如一个文章(Article)模型可以有多个评论(Comment)和标签(Tag)。通过多态关系可以轻松实现这样的关系结构。

创建多态关系的数据库表

首先,我们需要创建一个多态关系的数据库表。我们可以使用 Laravel 的迁移工具来完成这一步骤。以下是一个示例迁移文件:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTaggablesTable extends Migration
{
    public function up()
    {
        Schema::create('taggables', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('tag_id');
            $table->unsignedBigInteger('taggable_id');
            $table->string('taggable_type');
            $table->timestamps();
            
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
        });
    }

    public function down()
    {
        Schema::dropIfExists('taggables');
    }
}

在上面的示例中,我们创建了一个名为 taggables 的表,用于存储多态关系的信息。该表包含以下字段:

  • id:关系表的主键。
  • tag_id:关联的标签模型的外键。
  • taggable_id:关联模型的外键。
  • taggable_type:关联模型的类型。
定义多态关系

接下来,我们需要在模型之间定义多态关系。假设我们有一个 Tag 模型和一个 Article 模型,我们想要将标签和文章关联起来。在 Tag 模型中,我们可以使用 Laravel 的 morphToMany 方法定义多态关系:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;

class Tag extends Model
{
    protected $fillable = ['name'];

    public function articles(): MorphToMany
    {
        return $this->morphedByMany(Article::class, 'taggable');
    }
}

在上面的示例中,我们定义了一个 articles 方法来获取与该标签关联的所有文章。

Article 模型中,我们可以使用 Laravel 的 morphToMany 方法定义多态关系的反向关系:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;

class Article extends Model
{
    protected $fillable = ['title', 'content'];

    public function tags(): MorphToMany
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

在上面的示例中,我们定义了一个 tags 方法来获取与该文章关联的所有标签。

使用多态关系

一旦我们定义了多态关系,就可以使用它们来建立模型之间的关联关系。以下是一些示例用法:

添加标签到文章

$article = Article::find(1);
$tags = Tag::whereIn('name', ['Tag1', 'Tag2'])->get();
$article->tags()->attach($tags);

以上代码从数据库中获取 ID 为 1 的文章,并获取名称为 "Tag1" 和 "Tag2" 的标签。然后,通过 attach 方法将这些标签添加到文章的标签列表中。

获取文章的标签

$article = Article::find(1);
$tags = $article->tags;

以上代码获取 ID 为 1 的文章,并获取与该文章关联的所有标签。

从文章中移除标签

$article = Article::find(1);
$tags = Tag::whereIn('name', ['Tag1', 'Tag2'])->get();
$article->tags()->detach($tags);

以上代码从数据库中获取 ID 为 1 的文章,并获取名称为 "Tag1" 和 "Tag2" 的标签。然后,通过 detach 方法将这些标签从文章的标签列表中移除。

以上就是使用 Laravel 将模型添加到多态关系的基本方法。我们可以通过定义适当的关联方法来轻松地操作多态关联。希望这篇介绍对你有所帮助!