📅  最后修改于: 2023-12-03 15:37:51.669000             🧑  作者: Mango
在 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 模型: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()
方法来获取模型实例。最后,我们可以访问 actors
和 movies
属性,来获取关联的演员和电影。