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)

请注意:这还没有经过测试。