Laravel eager load a relationship based on the result of relationship 方法
Laravel eager load a relationship based on the result of relationship method
我有以下实体:
用户
class User extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableTrait;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'members';
protected $primaryKey = 'member_id';
public function licences(){
return $this->hasMany('Licence', 'subid', 'member_id');
}
}
执照
class Licence extends \Eloquent {
protected $table = 'licence';
protected $primaryKey = 'id';
protected $active = false;
const DATE_FORMAT = 'Y-m-d';
protected $fillable = [];
public function __construct(){
$this->checkifIsActive();
}
public function owner(){
return $this->belongsTo('User', 'member_id', 'subid');
}
public function checkifIsActive(){
if($this->start_date <= date($this->DATE_FORMAT) && $this->end_date >= date($this->DATE_FORMAT)) $this->active = true;
}
}
一个用户可以拥有多个许可,并且该用户拥有的许可可能处于活动状态或非活动状态 - 这由许可上的开始日期和结束日期决定。
我正在尝试加载一个用户对象,同时提取他们的许可证,但仅限那些处于活动状态的许可证。
在许可模型中,当对象被实例化时,我将 'active' 变量设置为 true,这样我们就有了一种了解许可状态的方法。
到目前为止我试过的代码是:
return User::findOrFail($id)->with('licence.active')->get();
然而,这并不完全正确 - 因为没有对 'licence.active' 进行实际状况检查。
我如何 return 一个用户,由一个 ID 加载,连同他们关联的许可证有一个布尔 'active' 变量设置为 'true'?
您可以像这样使用预加载约束来查询关系;
$user = User::with(array('license' => function($query){
$query->where('start', '<=', Carbon::now())
$query->where('end', '>=', Carbon::now())
}))->find($id);
这将仅 return 激活的许可证。
您可以选择像这样查询关系的结果;
public function activeLicences(){
return $this->hasMany('Licence', 'subid', 'member_id')->where('start', '<=', Carbon::now())->where('end', '>=', Carbon::now());
}
那么您只需执行以下操作即可获得结果;
$user = User::with('activeLicenses')->find($id)
请注意:这还没有经过测试。
我有以下实体:
用户
class User extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableTrait;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'members';
protected $primaryKey = 'member_id';
public function licences(){
return $this->hasMany('Licence', 'subid', 'member_id');
}
}
执照
class Licence extends \Eloquent {
protected $table = 'licence';
protected $primaryKey = 'id';
protected $active = false;
const DATE_FORMAT = 'Y-m-d';
protected $fillable = [];
public function __construct(){
$this->checkifIsActive();
}
public function owner(){
return $this->belongsTo('User', 'member_id', 'subid');
}
public function checkifIsActive(){
if($this->start_date <= date($this->DATE_FORMAT) && $this->end_date >= date($this->DATE_FORMAT)) $this->active = true;
}
}
一个用户可以拥有多个许可,并且该用户拥有的许可可能处于活动状态或非活动状态 - 这由许可上的开始日期和结束日期决定。
我正在尝试加载一个用户对象,同时提取他们的许可证,但仅限那些处于活动状态的许可证。
在许可模型中,当对象被实例化时,我将 'active' 变量设置为 true,这样我们就有了一种了解许可状态的方法。
到目前为止我试过的代码是:
return User::findOrFail($id)->with('licence.active')->get();
然而,这并不完全正确 - 因为没有对 'licence.active' 进行实际状况检查。
我如何 return 一个用户,由一个 ID 加载,连同他们关联的许可证有一个布尔 'active' 变量设置为 'true'?
您可以像这样使用预加载约束来查询关系;
$user = User::with(array('license' => function($query){
$query->where('start', '<=', Carbon::now())
$query->where('end', '>=', Carbon::now())
}))->find($id);
这将仅 return 激活的许可证。
您可以选择像这样查询关系的结果;
public function activeLicences(){
return $this->hasMany('Licence', 'subid', 'member_id')->where('start', '<=', Carbon::now())->where('end', '>=', Carbon::now());
}
那么您只需执行以下操作即可获得结果;
$user = User::with('activeLicenses')->find($id)
请注意:这还没有经过测试。