定义关联
一对一关联
1.一对一关联 hasOne()方法
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 获取与用户关联的电话记录。
*/
public function phone()
{
return $this->hasOne('App\Phone');
}
}
2.动态属性允许你访问关系方法就像访问模型中定义的属性一样???
$phone = User::find(1)->phone;
3.Eloquent 会基于模型名决定外键名称。???没有外键如何处理
一对一定义反向关联
1.我们可以使用与 hasOne 方法对应的 belongsTo 方法来定义反向关联:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model
{
/**
* 获得拥有此电话的用户。
*/
public function user()
{
return $this->belongsTo('App\User');
}
}
2.如果父级模型没有使用 id 作为主键,或者是希望用不同的字段来连接子级模型,则可以通过给 belongsTo 方法传递第三个参数的形式指定父级数据表的自定义键
/**
* 获得拥有此电话的用户
*/
public function user()
{
return $this->belongsTo('App\User', 'foreign_key', 'other_key');
}
一对多
1.hasMany()
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
/**
* 获取博客文章的评论
*/
public function comments()
{
return $this->hasMany('App\Comment');
}
}
2.当然,由于所有的关联还可以作为查询语句构造器使用,因此你可以使用链式调用的方式,在 comments 方法上添加额外的约束条件:
$comment = App\Post::find(1)->comments()->where('title', 'foo')->first();
一对多反向
1.belongsTo()
2.这个关系定义好以后,我们就可以通过访问 Comment 模型的 post 这个『动态属性』来获取关联的 Post 模型了:
$comment = App\Comment::find(1);
echo $comment->post->title;
多对多
- belongsToMany()
正如前面所提到的,为了确定关联连接表的表名,Eloquent 会按照字母顺序连接两个关联模型的名字。当然,你也可以不使用这种约定,传递第二个参数到 belongsToMany 方法即可:
return $this->belongsToMany('App\Role', 'role_user');
2.定义反向关联
要定义多对多的反向关联, 你只需要在关联模型中调用 belongsToMany 方法。我们在 Role 模型中定义 users 方法:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
/**
* 拥有此角色的用户
*/
public function users()
{
return $this->belongsToMany('App\User');
}
}
网友评论