创建具有所需关系的模型

时间:2018-01-01 00:32:31

标签: php laravel laravel-5 eloquent laravel-eloquent

我试图创建一个具有对象有效关系的模型。查询此模型不应返回任何缺少此关系的结果。似乎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;。

谢谢。

2 个答案:

答案 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);
    }
}