Я много работал с 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');
}
}
@JonasStaudenmeir Конечно, дай мне секунду.
@JonasStaudenmeir Готово, извините за задержку






Вы не можете вызвать 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().
Я имел в виду, что если я сниму метод first(), все будет работать нормально, но мне не нужен экземпляр Builder, мне нужен экземпляр модели, но когда я добавляю метод first() в цепочку, возникает исключение.
@ AarónGutiérrez Извините, я думал, что это проблема. Пожалуйста, посмотрите мой обновленный ответ.
Хех, позор мне, я только что увидел проблему в твоем ответе, большое спасибо
@ AarónGutiérrez Нет проблем. Рад, что смог помочь :)
Здесь вам нужно создать запрос, сначала вызвав метод 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();
Пожалуйста, опубликуйте отношения.