我有下一个特点:
<?php
namespace App\Traits;
trait LastElement {
public function scopeLast($query)
{
return $query->orderBy('id', 'desc')
->first();
}
}
正如您所看到的,Laravel的范围很简单。它的工作方式与first()
类似,但返回最后一个元素。
我有下一个型号:
<?php
namespace App;
use App\Traits\LastElement;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Daemon extends Model
{
use LastElement;
use SoftDeletes;
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected static function check()
{
$last = self::last();
if (!empty($last)) {
sleep(1);
return empty(self::where('id', $last->id)
->where('updated_at', $last->updated_at)
->first());
}
return true;
}
public static function start()
{
if (self::check()) {
$me = new self;
$me->save();
$i = 0;
while (true) {
$i++;
usleep(1 / 3 * 1000);
if (($i % 3) == 0) {
$i = 0;
$me->save();
}
}
}
}
}
无论这个模型做什么 - 但在check()
方法中,$last
var是Illuminate\Database\Eloquent\Builder
的实例。在我的另一个模型中,这个特性运作良好 - 我有什么不对?
答案 0 :(得分:0)
Scope应该返回一个Builder实例,因为它意味着可以链接。换句话说,范围永远不应该执行查询。
现在在你的情况下恕我直言,你不需要这个特性。只需使用内置范围latest()
:
HAVING COUNT(DISTINCT value) > 1