在 Laravel 中定义模型关联是每个 Laravel 开发者可能已经做过不止一次的事情。但是在试图实现关联时可能会遇到各种问题。因为 Laravel 有各种各样的关联,你应该选择哪一个?当涉及到查询模型时,我们如何充分利用模型关联的功能?
Laravel 的模型关联可能会让人糊涂。如果你不完全理解 Laravel 的关联在这一点上是如何工作的,别担心,读完这篇文章后,你会更好地理解它。
我们应该使用哪个模型关联?
要回答这个问题,首先你要知道有哪些可用的选项。Laravel 有 3 种不同的关联类型。
- 一对一
- 一对多
- 多对多
我们将逐个探讨不同的关联类型并解释一下应该什么时候使用它们。
一对一
一对一关联是目前存在的最基本的关联。这种关联意味着 A 模型只能链接到 B 模型,相反也是如此。举个例子,一个 User 模型和一个 Passport 模型会成为一对一的关联。一个用户只能拥有一张通行证,同样,一张通行证也只属于一个用户。
让我们看看如何在代码中定义这种关联。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { public function passport() { return $this->hasOne(App\Passport::class); } }
在 User 模型中我们创建了一个 passport 方法。我们通过 hasOne 方法告诉 Laravel User 模型有一个 Passport 。
注意:
所有用于定义关联的方法都有可选的额外参数,你可以在这些参数中定义本地键和外键。默认情况下,Laravel会假设你在用户模型中定义了 passport_id ,因为你试图创建与 passport 模型的关联。创建迁移文件时也请注意这一点!
在 Passport 模型中,我们需要定义逆向的关联。我们要让 Passport 模型知道它属于 User 模型。我们可以使用 belongsTo 方法来实现这一点。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Passport extends Model { public function user() { return $this->belongsTo(App\User::class); } }
一对多
你可以在 Laravel 中定义的下一个关联是一对多关联。 这种类型的关联意味着一个类型A的模型可以链接到多个类型B的模型。但是类型B的模型只属于一个类型A的模型。
例如,User 模型和 Invoice 模型之间的关联是一对多关联。 用户可以拥有多个账单,但账单仅属于一个用户。
在代码中是这样写的:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { public function invoices() { return $this->hasMany(App\Invoice::class); } }
内容版权声明:除非注明,否则皆为本站原创文章。