6.模型、关联关系、修改器及访问器

2019-12-10  本文已影响0人  darren911

定义关联

一对一关联

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;

多对多

  1. 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');
    }
}
上一篇 下一篇

猜你喜欢

热点阅读