📜  多对多关系 laravel 示例 - PHP (1)

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

多对多关系 Laravel 示例 - PHP

在 Laravel 中,我们可以很容易地定义多对多关系,这是通过使用中间表来实现的。这种关系很常见,例如一个电影可以有多个演员,而一个演员也可以出演多个电影。在本篇文章中,我们将介绍如何在 Laravel 中定义多对多关系。

创建表

首先,我们需要创建三个表:电影表(movies)、演员表(actors)和中间表(movie_actor)。中间表包含 foreign key 来分别关联电影表和演员表。

CREATE TABLE movies (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    release_year INT
);

CREATE TABLE actors (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE movie_actor (
    id INT AUTO_INCREMENT PRIMARY KEY,
    movie_id INT,
    actor_id INT,
    FOREIGN KEY (movie_id) REFERENCES movies(id),
    FOREIGN KEY (actor_id) REFERENCES actors(id)
);
定义 Eloquent 模型

接下来,我们需要定义两个 Eloquent 模型:Movie 和 Actor。

Movie 模型的定义如下所示:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Movie extends Model
{
    protected $fillable = ['title', 'release_year'];

    public function actors()
    {
        return $this->belongsToMany(Actor::class);
    }
}

Actor 模型的定义如下所示:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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

    public function movies()
    {
        return $this->belongsToMany(Movie::class);
    }
}

在模型中,我们使用 belongsToMany 方法来定义多对多关系。该方法接受一个模型名称作为参数(例如 Actor::class),并返回一个被动关联对象。在我们的示例中,Movie 和 Actor 模型都包含一个 Many-To-Many 的关联关系,分别使用 belongsToMany 方法方法来定义。

创建数据

有了模型和表结构,我们现在可以创建一些数据。这里是一个示例:

<?php

use App\Models\Movie;
use App\Models\Actor;

// 创建电影对象
$movie1 = Movie::create([
    'title' => 'The Dark Knight',
    'release_year' => 2008,
]);

$movie2 = Movie::create([
    'title' => 'Inception',
    'release_year' => 2010,
]);

// 创建演员对象
$actor1 = Actor::create([
    'name' => 'Heath Ledger',
]);

$actor2 = Actor::create([
    'name' => 'Leonardo DiCaprio',
]);

// 关联电影和演员
$movie1->actors()->attach([$actor1->id, $actor2->id]);
$movie2->actors()->attach([$actor2->id]);

在这个示例中,我们首先创建了两个电影对象和两个演员对象。然后,我们通过调用 attach() 方法,将这些电影和演员关联起来。

查询数据

现在,我们可以使用 Eloquent 模型来查询数据。以下是一些例子:

<?php

use App\Models\Movie;
use App\Models\Actor;

// 获取所有电影与演员
$movies = Movie::all();
foreach ($movies as $movie) {
    echo $movie->title . ': ';
    foreach ($movie->actors as $actor) {
        echo $actor->name . ' ';
    }
    echo '<br>';
}

// 获取所有演员与电影
$actors = Actor::all();
foreach ($actors as $actor) {
    echo $actor->name . ': ';
    foreach ($actor->movies as $movie) {
        echo $movie->title . ' ';
    }
    echo '<br>';
}

// 获取特定演员出演的电影
$heath = Actor::where('name', 'Heath Ledger')->first();
foreach ($heath->movies as $movie) {
    echo $movie->title . '<br>';
}

// 获取特定电影的演员
$inception = Movie::where('title', 'Inception')->first();
foreach ($inception->actors as $actor) {
    echo $actor->name . '<br>';
}

在这些示例中,我们使用 Movie::all()Actor::all() 方法获取所有的电影和演员,然后通过循环遍历它们。我们也可以使用 where 条件获取特定的电影或演员,并使用 first() 方法来获取模型实例。最后,我们可以访问 actorsmovies 属性,来获取关联的演员和电影。