larave5.1\5.2 一对一和一对多关系的使用教程
在笔者开始对arave5.1\5.2 一对一和一对多关系使用用先郑重说明一下,如有说的不足之处,还请谅解。
先来说一下一对一和一对多的关系,这个相信大家都能理解。理解起来不是很难.
一对一
一对一关联是一个非常简单的关联关系,例如,一个User模型有一个与之对应的Phone模型。要定义这种模型,我们需要将phone方法置于User模型中,phone方法应该返回Eloquent模型基类上hasOne方法的结果:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 获取关联到用户的手机 */ public function phone() { return $this->hasOne('App\Phone'); }}
传递给hasOne方法的第一个参数是关联模型的名称,关联关系被定义后,我们可以使用Eloquent的动态属性获取关联记录。动态属性允许我们访问关联函数就像它们是定义在模型上的属性一样:
$phone = User::find(1)->phone;
Eloquent默认关联关系的外键基于模型名称,在本例中,Phone模型默认有一个user_id外键,如果你希望重写这种约定,可以传递第二个参数到hasOne方法:
return $this->hasOne('App\Phone', 'foreign_key');
此外,Eloquent假设外键应该在父级上有一个与之匹配的id,换句话说,Eloquent将会通过user表的id值去phone表中查询user_id与之匹配的Phone记录。如果你想要关联关系使用其他值而不是id,可以传递第三个参数到hasOne来指定自定义的主键:
return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
2.1.1 定义相对的关联
我们可以从User中访问Phone模型,相应的,我们也可以在Phone模型中定义关联关系从而让我们可以拥有该phone的User。我们可以使用belongsTo方法定义与hasOne关联关系相对的关联:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Phone extends Model{ /** * 获取手机对应的用户 */ public function user() { return $this->belongsTo('App\User'); }}
在上面的例子中,Eloquent将会尝试通过Phone模型的user_id去User模型查找与之匹配的记录。Eloquent通过关联关系方法名并在方法名后加_id后缀来生成默认的外键名。然而,如果Phone模型上的外键不是user_id,也可以将自定义的键名作为第二个参数传递到belongsTo方法:
/** * 获取手机对应的用户 */public function user(){ return $this->belongsTo('App\User', 'foreign_key');}
如果父模型不使用id作为主键,或者你希望使用别的列来连接子模型,可以将父表自定义键作为第三个参数传递给belongsTo方法:
/** * 获取手机对应的用户 */public function user(){ return $this->belongsTo('App\User', 'foreign_key', 'other_key');}
一对多
“一对多”是用于定义单个模型拥有多个其它模型的关联关系。例如,一篇博客文章拥有无数评论,和其他关联关系一样,一对多关联通过在Eloquent模型中定义方法来定义:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Post extends Model{ /** * 获取博客文章的评论 */ public function comments() { return $this->hasMany('App\Comment'); }}
记住,Eloquent会自动判断Comment模型的外键,为方便起见,Eloquent将拥有者模型名称加上id后缀作为外键。因此,在本例中,Eloquent假设Comment模型上的外键是post_id。
关联关系被定义后,我们就可以通过访问comments属性来访问评论集合。记住,由于Eloquent提供“动态属性”,我们可以像访问模型的属性一样访问关联方法:
$comments = App\Post::find(1)->comments;foreach ($comments as $comment) { //}
当然,由于所有关联同时也是查询构建器,我们可以添加更多的条件约束到通过调用comments方法获取到的评论上:
$comments = App\Post::find(1)->comments()->where('title', 'foo')->first();
和hasOne方法一样,你还可以通过传递额外参数到hasMany方法来重新设置外键和本地主键:
return $this->hasMany('App\Comment', 'foreign_key');return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
2.2.1 定义相对的关联
现在我们可以访问文章的所有评论了,接下来让我们定义一个关联关系允许通过评论访问所属文章。要定义与hasMany相对的关联关系,需要在子模型中定义一个关联方法去调用belongsTo方法:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Comment extends Model{ /** * 获取评论对应的博客文章 */ public function post() { return $this->belongsTo('App\Post'); }}
关联关系定义好之后,我们可以通过访问动态属性post来获取一条Comment对应的Post:
$comment = App\Comment::find(1);echo $comment->post->title;
在上面这个例子中,Eloquent尝试匹配Comment模型的post_id与Post模型的id,Eloquent通过关联方法名加上_id后缀生成默认外键,当然,你也可以通过传递自定义外键名作为第二个参数传递到belongsTo方法,如果你的外键不是post_id,或者你想自定义的话:
/** * 获取评论对应的博客文章 */public function post(){ return $this->belongsTo('App\Post', 'foreign_key');}
如果你的父模型不使用id作为主键,或者你希望通过其他列来连接子模型,可以将自定义键名作为第三个参数传递给belongsTo方法:
/** * 获取评论对应的博客文章 */public function post(){ return $this->belongsTo('App\Post', 'foreign_key', 'other_key');}
以上是laravel官方的详明,虽然详细,但还是有点不懂;
1一对一关系
其实一对一就是有两张表,两张表有两个对应Model模型,这两个模型中我们要建立一对一的关系如:
正向
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 获取关联到用户的手机
*/
public function phone()
{
return $this->hasOne('App\Phone');
}
}
反向
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model{
/**
* 获取手机对应的用户
*/
public function user()
{
return $this->belongsTo('App\User');
}
}
这样一对一的就好了,哪如何使用呢?如下:
注:在使用看前先说明Phone模型对应表中有一个user_id的字段,就是通过这个user_id取得用户和手机的关系.
a.新增用户手机
User::find($id)->phone()->save(Phone::create($request->all()))
这样就为当前id的用户新增了一个手机
b.查询用户手机.
User::find($id)->phone->name
c.删修都是差不多
1一对多关系
一对多关系和一对一的关系差不多就哪上面的例子来说:
正向
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 获取关联到用户的手机
*/
public function phone()
{
return $this->hasMany('App\Phone');
}
}
反向
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model{
/**
* 获取手机对应的用户
*/
public function user()
{
return $this->belongsTo('App\User');
}
}
这样一对多的就好了,哪如何使用呢?也一样如下:
注:在使用看前先说明Phone模型对应表中有一个user_id的字段,就是通过这个user_id取得用户和手机的关系.
a.新增用户手机
User::find($id)->user()->save(Phone::create($request->all()))
这样就为当前id的用户新增了一个手机
b.查询用户的所有手机.
foreach(User::find($id)->phone as $phones){
$phones->name
}
larave5.1\5.2 一对一和一对多关系的使用就到这下次说多对多的关系,谢谢!