Php 返回模型的类作用域函数

Php 返回模型的类作用域函数,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,这些回答解释了模型作用域不打算返回任何东西,而应该使用查询生成器实例和自定义getter来返回模型实例 问题 在我的例子中,我有一个用户和合同模型,其中一个用户有许多合同。合同期限可能重叠,但在任何给定时间,只有具有最新开始日期的合同才应被视为有效(例如,给定的合同1从2017-01-01到2017-07-31,合同2从2017-06-01到2017-12-31,对于2017-07-01,应返回合同2) 当前解决方案 使用作用域时,我必须首先调用->(): 或 问题 是否有某种方法可以直接在查询

这些回答解释了模型作用域不打算返回任何东西,而应该使用查询生成器实例和自定义getter来返回模型实例

问题

在我的例子中,我有一个
用户
合同
模型,其中一个用户有许多合同。合同期限可能重叠,但在任何给定时间,只有具有最新开始日期的合同才应被视为有效(例如,给定的合同1从
2017-01-01
2017-07-31
,合同2从
2017-06-01
2017-12-31
,对于
2017-07-01
,应返回合同2)

当前解决方案

使用作用域时,我必须首先调用
->()

问题


是否有某种方法可以直接在查询生成器(关系)类作用域上调用
byDate()
current()
,而无需传递其他参数并返回模型实例而不是生成器,并且必须先调用
first()
每次?

对于您的情况,您可以将逻辑封装在用户模型中的一个方法中,然后在需要时调用它,而无需使用
->first()

用户模型

public function currentContract() { 
    return $this->contracts()->current()->first(); 
}

public function contractByDate($date) { 
    return $this->contracts()->byDate($date)->first(); 
}
至于电话:

$user->contractByDate('some-date');
$user->currentContract();

漂亮干净:)

为什么不在用户中创建这样的方法
公共函数currentContract(){return$this->contracts()->current()->first();}
然后您所要做的就是
$user->currentContract()
!!我会照@Maraboc说的做。只需将该逻辑包装到一个方法中。Laravel有所有这些很酷的东西,比如访问器、变异器、作用域等等,但它们并不适用于所有场景。我为这个案例添加了一个答案@ingkevin这只是一个建议,但当人们喜欢它时,为什么不把它作为答案;)我几乎有同样的想法,把where放在用户模型的函数上,这对我来说似乎太耦合了。把where放在一个契约范围内,并从用户的方法访问它是“很好而且干净”的,这让我觉得有点愚蠢。谢谢你的提示:)很乐意帮忙;)
public static function byUserAndDate(User $user, $date) {
    return $user->contracts()->where...->where...->orderBy(...)->first()
}
...
Contract::byUserAndDate($user, 'some-date');
public function currentContract() { 
    return $this->contracts()->current()->first(); 
}

public function contractByDate($date) { 
    return $this->contracts()->byDate($date)->first(); 
}
$user->contractByDate('some-date');
$user->currentContract();