Вызов функции-члена getQuery () при нулевом значении Laravel Eloquent

Я много работал с Laravel и никогда не получал следующей ошибки:

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(), возникает это исключение. Версия Laravel, которую я использую, - 5.5.

Модель 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');
    }
}

Пожалуйста, опубликуйте отношения.

Jonas Staudenmeir 26.09.2018 18:12

@JonasStaudenmeir Конечно, дай мне секунду.

Aarón Gutiérrez 26.09.2018 18:16

@JonasStaudenmeir Готово, извините за задержку

Aarón Gutiérrez 26.09.2018 18:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
5 003
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не можете вызвать get_query() на ->first().

->first() вернет первый результат вашего запроса и, таким образом, выполнит запрос SQL (после first() вы получите результат null, если нет результата, или объект результата вашего запроса). Вы сможете использовать get_query() или get(), если удалите first(), поскольку у вас будет красноречивый экземпляр запроса, а не объект результата или коллекция.

Ответ принят как подходящий

Итак, проблема в вашей модели 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');
}

Но я не использую метод getQuery() :(, этот метод, похоже, выполняется при использовании first() в файле поставщика, мне нужен экземпляр модели, поэтому я использовал метод first().

Aarón Gutiérrez 26.09.2018 18:37

Я имел в виду, что если я сниму метод first(), все будет работать нормально, но мне не нужен экземпляр Builder, мне нужен экземпляр модели, но когда я добавляю метод first() в цепочку, возникает исключение.

Aarón Gutiérrez 26.09.2018 18:38

@ AarónGutiérrez Извините, я думал, что это проблема. Пожалуйста, посмотрите мой обновленный ответ.

Marcin Nabiałek 26.09.2018 18:59

Хех, позор мне, я только что увидел проблему в твоем ответе, большое спасибо

Aarón Gutiérrez 26.09.2018 19:02

@ AarónGutiérrez Нет проблем. Рад, что смог помочь :)

Marcin Nabiałek 26.09.2018 19:02

Здесь вам нужно создать запрос, сначала вызвав метод 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();

Другие вопросы по теме