一对多
例如一个用户会有多条留言,有member会员表和message留言表,一对多关联的定义也是在 Eloquent 模型中写一个方法:
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
/**
* 获得用户的留言。
*/
public function message()
{
return $this->hasMany('App\Http\Models\Message','member_id','id');
}
}
其中'App\Http\Models\Message'是要关联的模型,member_id是message表(子表)中的外键字段,省略时laravel自动填充为(主表名_id),id是member表(主表)的主键,省略时laravel默认为id。
用法:
1、获取会员1058@qq.com对应的留言
$message = Member::where('email','1058@qq.com')->first()->message;
2、获取会员1058@qq.com对应的一天以前的留言
$message = Member::where('email','1058424094@qq.com')->first()
->message()->where('created_at','<',date('Y-m-d'))->get();
一对多(反向)
通过一对多的关联可以利用会员表获得会员的留言信息,如果想通过留言信息获得会员信息就需要用到hasMany的反向关联,需要在子级模型(message)中使用 belongsTo
方法定义它,如下所示
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
/**
* 获得留言的用户。
*/
public function member()
{
return $this->belongsTo('App\Http\Models\Member','member_id','id')->withDefault([
'user_name' => '阿文',
]);
}
}
其中'App\Http\Models\Member'是要关联的模型,member_id是message表(子表)中的外键字段,省略时laravel自动填充为(主表名_id),id是member表(主表)的主键,省略时laravel默认为id。withDefault是主表中没有对应数据时(对应值为null)填充的数据。
用法:
1、获取id为1的留言对应的会员信息
$member = Message::find(1)->member;