Laravel Eloquent 关联

本文详细介绍了Laravel框架中的Eloquent ORM关联模型,包括一对一、一对多、多对多等多种关联类型,并展示了如何定义、操作和查询关联数据,如动态属性、中间表、多态关联等,同时涵盖保存、更新和删除关联模型的方法。
摘要由CSDN通过智能技术生成

模型关联

Eloquent关联在模型中以方法的形式呈现,提供了强大的链式调用和查询功能。可以分为一对一、一对多、多对多、远程一对多、多态一对一、多态一对多、多态多对多、自定义几种。


一对一

用户 User 和手机 Phone 是关联模型,用户拥有手机,手机属于用户。

关联

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{

	//获取用户关联的手机
	public function phone()
	{
		return $this->hasOne('App\Phone');
	}
}

一旦定义了关联,就可以使用Eloquent的动态属性获取相关的记录,如下:

$phone = User::find(1)->phone;

Eloquent会基于模型决定外键名称,会自动假设 Phone 模型有一个 user_id 字段,如果想要覆盖这个决定,可以传递 hasOne 第二个参数,如下:

return $this->hasOne('App\Phone', 'foreign_key');

如果Eloquent外键值与父级id不匹配,可以传递 hasOne 第三个参数,如下:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');

反向关联

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
	//获得拥有此手机的用户
	public function user()
	{
		return $this->belongsTo('App\User');
	}
}


一对多

文章 Post 和评论 Comment 是关联模型,对一篇文章可以发表很多评论。

关联

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
	//获取文章的评论
	public function comments()
	{
		return $this->hasMany('App\Comment');
	}
}

访问 Post 文章的 comments 的属性获取评论的集合,如下:

	$comments = App\Comment::find(1)->comments();
	foreach ( $comments as $comment) {
		//
	}

还可以添加过滤,如下:

	$comments = App\Comment::find(1)->comments()->where('title', 'xxx')->first();

反向关联

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
	//获取评论所属文章
	public function post()
	{
		return $this->belongsTo('App\Post');
	}
}

定义好之后,可以通过 Comment 模型的 post 动态属性来访问,如下:

$comment = App\Comment::find(1);
echo $comment->post->title;

多对多

用户 User ,角色 Role (中间模型为 UserRole )模型可以认为是多对多关联,用户可以有多个角色,每个角色可以为多个用户所有。对应的数据分别为 usersrolesrole_user 。其中 role_user 是按两个模型字母排序,包含 user_idrole_id 两个字段。

关联

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值