我试图创建一个具有对象有效关系的模型。查询此模型不应返回任何缺少此关系的结果。似乎global scopes是此方案的最佳选择,但我无法完成此工作。难道我做错了什么?或许还有更好的方法吗?
以下是该模型的简化版本。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Car extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope('has_details', function ($builder) {
$builder->has('details');
});
}
public function details()
{
return $this->hasOne(Details::class);
}
}
这是另一个模型上的一对多关系方法。
public function cars()
{
return $this->hasMany(Car::class);
}
如果没有全局范围,此代码将返回所有相关的&#34;汽车&#34;,包括没有&#34;详细信息&#34;。在全球范围内,没有&#34;汽车&#34;被退回。我希望这段代码只能返回&#34; cars&#34;用&#34;详细信息&#34;。
谢谢。
答案 0 :(得分:1)
您在Anonymous Global Scopes声明中有一些错误:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Car extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope('has_details', function (Builder $builder) {
$builder->has('details');
});
}
public function details()
{
return $this->hasOne(Details::class);
}
}
答案 1 :(得分:0)
您可能会尝试急切加载关系,以便has()
检查实际上会看到某些内容。 (我怀疑因为没有加载关系,所以永远不会填充details
关系。)
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Car extends Model
{
protected $with = ['details'];
protected static function boot()
{
parent::boot();
static::addGlobalScope('has_details', function (Builder $builder) {
$builder->has('details');
});
}
public function details()
{
return $this->hasOne(Details::class);
}
}