larave5.1\5.2 多对多关系的使用教程
在笔者开始对arave5.1\5.2 多对多关系使用用先郑重说明一下,如有说的不足之处,还请谅解。
前面说了一对一和一对多的关系,这个相信大家都能理解。理解起来不是很难
多对多呢?也不是很难,但我看官方的感觉有点困难!
先看官方的:
多对多关系比hasOne和hasMany关联关系要稍微复杂一些。这种关联关系的一个例子就是一个用户有多个角色,同时一个角色被多个用户共用。例如,很多用户可能都有一个“Admin”角色。要定义这样的关联关系,需要三个数据表:users、roles和role_user,role_user表按照关联模型名的字母顺序命名,并且包含user_id和role_id两个列。
多对多关联通过编写一个调用Eloquent基类上的belongsToMany方法的函数来定义:
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 用户角色
*/
public function roles()
{
return $this->belongsToMany('App\Role');
}
}
关联关系被定义之后,可以使用动态属性roles来访问用户的角色:
$user = App\User::find(1);
foreach ($user->roles as $role) {
//
}
当然,和所有其它关联关系类型一样,你可以调用roles方法来添加条件约束到关联查询上:
$roles = App\User::find(1)->roles()->orderBy('name')->get();
正如前面所提到的,为了决定关联关系连接表的表名,Eloquent以字母顺序连接两个关联模型的名字。然而,你可以重写这种约定——通过传递第二个参数到belongsToMany方法:
return $this->belongsToMany('App\Role', 'user_roles');
除了自定义连接表的表名,你还可以通过传递额外参数到belongsToMany方法来自定义该表中字段的列名。第三个参数是你定义的关系模型的外键名称,第四个参数你要连接到的模型的外键名称:
return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
上面官方的以用户角色为例说得详细,但是我们就是不知从何下手.
多对多的关系函数就是这个>belongsToMany他的正向和反向都用这个belongsToMany方法.
前面也说过了一对一和一对多的我还是以用户手机为例:
假设公司有多个手机和多名员工,某个手机的工能也不一样.而任意一个或多个手机他可以给一个任意一人员工用,任意一个或多个员工也可以用不同的手机做他想做的事。这就是多对多.
正向
注:在使用看前先要有一张中间表,而且表名是两个表的名用下划线连起来,user_phone,不要加s,模型对应表中有两个user_id/phone_id的字段,就是通过这两个user_id/phone_id字段取得用户和手机的关系.
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 获取关联到用户的手机
*/
public function phones()
{
return $this->belongsToMany('App\Phone');
}
}
反向
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model{
/**
* 获取手机对应的用户
*/
public function users()
{
return $this->belongsToMany('App\User');
}
}
a.新增用户手机
$user->phones()->sync(Phone::create($request->all()));
备注:sync()中可以是数组,
这样就为当前id的用户新增了一个手机
b.查询用户的所有手机.
foreach(User::find($id)->phone as $phones){
$phones->name
}
c,不让用户拥有其中一台手机,如支持打游戏的,哈哈
$user->phones()->detach($id);
备注:$id是你给定的手机的id
到这larave5.1\5.2 对对多关系的使用讲解就完了,如果你觉得还行和话,转发此链接给更多的朋友,谢谢!
