文章转发自专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...在Laravel中定义模型关联,可能是每个Laravel开发者都做过的不止一次。但是您在尝试实现关联时可能会遇到各种问题。由于Laravel有各种依赖项,您应该选择哪一个?在查询模型时,我们如何充分利用模型关联的力量?Laravel的模型关联可能会令人困惑。如果你此时还不完全理解Laravel的关系是如何工作的,别担心,阅读本文后你会更好地理解它。我们应该使用哪种模型关联?要回答这个问题,您首先需要知道有哪些选项可用。Laravel有3种不同的关系类型。一对一对多多对多我们将一一探讨不同的关系类型,并解释何时应该使用它们。一对一关联是当今存在的最基本的关联。这种关联意味着A模型只能链接到B模型,反之亦然。例如,用户模型和护照模型将具有一对一的关系。一个用户只能拥有一个通行证,同理,一个通行证也只属于一个用户。让我们看看如何在代码中定义这个关联。hasOne(App\Passport::class);}}}在用户模型中,我们创建了一个护照方法。我们通过hasOne方法告诉LaravelUser模型有一个Passport。注意:所有用于定义关联的方法都有可选的额外参数,您可以在其中定义本地键和外键。默认情况下,Laravel会假定您在User模型中定义了passport_id,因为您正在尝试创建与护照模型的关系。在创建迁移文件时也要注意这一点!在Passport模型中,我们需要定义反向关联。我们要让Passport模型知道它属于User模型。我们可以使用belongsTo方法来实现这一点。belongsTo(App\User::class);}}}一对多你可以在Laravel中做到这一点下一个定义的关联是一对多关联。这种关联是指一个类型A的模型可以链接到多个类型B的模型。但是一个类型B的模型只属于一个类型A的模型。例如User模型和Invoice模型之间的关系是一对多的关系。一个用户可以有多个账单,但一个账单只属于一个用户。这是写在代码中的:}}看起来像我们之前用来定义一对一关联的代码,对吧?我们现在要做的就是让Invoice模型知道它属于User模型。让我们定义一对多关系的反向对应物。belongsTo(App\User::class);}}}many-to-many最后要定义的关联是多对多的关联。这种类型的关联意味着一个类型A的模型可以链接到多个类型B的模型,反之亦然。例如,发票模型和产品模型之间的关联是多对多关联。一个账单可以包含多个商品,一个商品可以属于多个账单。belongsToMany(App\Product::class);}}}您可以像这样定义这种关联逆关系:);}}多对多关联实现起来稍微困难一些,因为它们需要数据库中的中间表。您可以通过创建迁移文件在Laravel中创建此中间表。远程关联远程一对一通过单个中间关联模型进行关联。如果每个供应商都有一个用户,并且每个用户都与用户历史相关联,那么供应商可以通过用户访问用户的历史。这是定义此关联所需的数据库表:“关系。hasOneThrough(App\History::class,App\Product::class);}}}传递hasOneThrough方法的第一个参数是您希望访问的模型的名称。第二个参数是中间模型的名称。远程一对多“有多个通过”关联等同于“有一个通过”关联,但用于多个记录。让我们使用前面的示例,但让我们改变一件事:产品现在可以有多个历史记录条目,而不是一个。数据库表保持不变。hasManyThrough(App\History::class,App\Product::class);}}}像这样,供应商模型可以访问产品的历史条目。查询关系查询关系非常简单。由于我们为Passport定义了一对一关系,为Invoice定义了一对多关系,我们可以在User模型中使用它们。在User模型的每个实例上,我们都可以获得相应的Passport和Invoice。passport->expiration_date;//查询发票关联foreach($user->invoicesas$invoice){$invoice->total_amount;}也可以查询关联的反向关联。如果你有账单,你可以得到那个账单的用户。user->first_name;查询多对多关联与其他关联完全一样。此外,多对多关联具有枢轴属性。此属性表示一个中间表,可以像任何其他模型一样使用。例如,假设连接表有一个created_at字段,我们可以使用pivot来获取created_at字段。productsas$product){$product->pivot->created_at;}queryhas一个通过并有许多通过工作完全像其他协会一样。添加约束条件可以在查询时将约束条件添加到关系中。看看下面的例子:passport()->where('active',1)->orderBy('expiration_date');检查关联是否存在对于这些关联,Laravel有一些方法可以帮助你检查:get();//查找所有没有护照的用户所有有护照的用户$users=App\User::doesntHave('passport')->get();//查找包含5个或更多产品的发票$invoices=App\发票::有('产品','>=',5)->get();希望这篇文章能让你对Laravel的模型关联有更好的了解。感谢您的阅读!
