代码之家  ›  专栏  ›  技术社区  ›  Aarón Gutiérrez

对null Laravel Eloquent调用成员函数getQuery()

  •  1
  • Aarón Gutiérrez  · 技术社区  · 6 年前

    我曾与拉威尔合作过很多次,但从未出现以下错误:

    Call to a member function getQuery() on null /vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php line 558 .

            $id = 7;
            $compra = Compra::where('id', $id)
                                ->with(['certificado',
                                        'certificado.duracionServicios', 
                                        'certificado.duracionServicios.servicio', 
                                        'certificado.duracionServicios.servicio.traducciones' => function($query){
                                             $query->whereHas('idiomas', function($q){
                                                 $q->where('codigo_region', 'es_MX');
                                             });
                                         },
                                        'user'])
                                        ->first();
    

    如果我拿出 first() Builder ,但当我尝试使用它甚至使用 get()

    模型 Compra

    namespace App\Models\Sitio;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Compra extends Model
    {
        protected $table = 'compras';
    
        protected $fillable = ['folio',
                                'fecha_compra',
                                'subtotal',
                                'total',
                                'user_id',
                                'direccion_id',
                                ];
    
    
        protected $dates = ['created_at', 'updated_at'];
    
        /**
         * Get the value of the model's route key.
         *
         * @return mixed
         */
        public function getRouteKey()
        {
            $hashids = new \Hashids\Hashids(config('app.name'), 5);
    
            return $hashids->encode($this->getKey());
        }
    
    
        public function certificado(){
            $this->hasOne('App\Models\Sitio\Certificado', 'compra_id');
        }
    
        public function user(){
            return $this->belongsTo('App\User', 'user_id');
        }                   
    }
    

    模型 Certificado

    namespace App\Models\Sitio;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Certificado extends Model
    {
        protected $table = 'certificados';
    
        protected $fillable = ['fecha_servicio',
                                'hora_servicio',
                                'compra_id',
                                ];
    
    
        protected $dates = ['created_at', 'updated_at'];
    
        public function compra(){
            return $this->belongsTo('App\Models\Sitio\Compra', 'compra_id');
        }
    
        public function duracionServicios(){
            return $this->belongsToMany('App\Models\Sitio\DuracionServicio', 'certificados_duracion_servicios', 'certificado_id', 'duracion_id');
        }
    }
    

    DuracionServicio

    namespace App\Models\Sitio;
    
    use Illuminate\Database\Eloquent\Model;
    
    class DuracionServicio extends Model
    
    {
        protected $table = 'duracion_servicios';
    
    protected $fillable = ['costo',
                            'servicio_id',
                            ];
    
    protected $dates = ['created_at', 'updated_at'];
    
    public function certificados(){
        return $this->belongsToMany('App\Http\Models\Sitio\Certificado', 'certificados_duracion_servicios', 'duracion_id', 'certificado_id');
    }
    
    public function servicio(){
        return $this->belongsTo('App\Models\Sitio\Servicio', 'servicio_id');
    }
    
    public function traducciones(){
        return $this->hasMany('App\Models\Sitio\DuracionServicioTraduccion', 'duracion_id');
    }
    }
    

    模型 Servicio

    namespace App\Models\Sitio;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Servicio extends Model
    {
        protected $table = 'servicios';
    
        protected $fillable = ['seccion_id'];
    
        protected $dates = ['created_at', 'updated_at'];
    
    
        public function traducciones(){
            return $this->hasMany('App\Models\Sitio\ServicioTraduccion', 'servicio_id');
        }
    
        public function duraciones(){
            return $this->hasMany('App\Models\Sitio\DuracionServicio', 'servicio_id');
        }
    }
    

    模型 ServicioTraduccion

    namespace App\Models\Sitio;
    
    use Illuminate\Database\Eloquent\Model;
    
    class ServicioTraduccion extends Model
    {
        protected $table = 'servicios_traducciones';
    
        protected $fillable = ['nombre',
                                'descripcion', 
                                'contenido', 
                                'idioma_id', 
                                'servicio_id',
                                ];
    
        protected $dates = ['created_at', 'updated_at'];
    
        public function servicio(){
            return $this->belongsTo('App\Models\Sitio\Servicio', 'servicio_id');
        }
    
        public function idioma(){
            return $this->belongsTo('App\Models\Sitio\Idioma', 'idioma_id');
        }
    }
    

    Idioma

    namespace App\Models\Sitio;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Idioma extends Model
    {
        protected $table = 'servicios_traducciones';
    
        protected $fillable = ['nombre',
                                'codigo_region',
                                ];
    
        protected $dates = ['created_at', 'updated_at', 'deleted_at'];
    
        public function servicios(){
            return $this->hasMany('App\Models\Sitio\ServicioTraduccion', 'idioma_id');
        }
    
        public function duraciones(){
            return $this->hasMany('App\Models\Sitio\DuracionServicioTraduccion', 'idioma_id');
        }
    }
    
    3 回复  |  直到 6 年前
        1
  •  9
  •   Marcin Nabiałek    6 年前

    好吧,问题出在你的 Compra

    public function certificado()
    {
        $this->hasOne('App\Models\Sitio\Certificado', 'compra_id');
    }
    

    你忘了加 return . 应该是:

    public function certificado()
    {
        return $this->hasOne('App\Models\Sitio\Certificado', 'compra_id');
    }
    
        2
  •  0
  •   Mtxz    6 年前

    你不能打电话 get_query() ->first()

    -&燃气轮机;第一() first() 你得到一个 null 结果(如果没有结果,或查询结果对象)。你应该可以使用 获取查询() get() 如果你移除 第一() 因为您将有一个雄辩的查询实例,而不是结果对象或集合。

        3
  •  0
  •   tam    6 年前

    query() 方法优先。

           $id = 7;
           $compra = Compra::query()->where('id', $id)
            ->with(['certificado',
                    'certificado.duracionServicios', 
                    'certificado.duracionServicios.servicio', 
                    'certificado.duracionServicios.servicio.traducciones' => function($query){
                            $query->whereHas('idiomas', function($q){
                                $q->where('codigo_region', 'es_MX');
                            });
                        },
                'user'])
                ->get();
    

    或者你可以用 ->first();