Из этой документации Laravel 5.1 кажется, что я могу переопределить foreign_key
и local_key
следующим для отношения HasMany:
return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
Я изменил внешние ключи в моей belongsTo
модели NpcTarget
с npc_id
на npc_id_fk
. Поэтому я изменил отношение к:
public function npc()
{
return $this->belongsTo(Npc::class, 'npc_id_fk', 'id');
}
npc_id_fk
ссылается на идентификатор внешнего ключа npc
, а id
- фактическое имя столбца в npc
.
Моя цель - загрузить quest
его task
его npc
его npctarget
. Выполнение моего собственного запроса работает как ожидалось:
select n.id, nt.id from npcs n inner join npcstarget nt on (n.id = nt.npc_id_fk);
Проблема : Учитывая приведенные ниже отношения, при запуске этого браузера время ожидания истекло. Я получаю ошибку:
FatalErrorException в QueryCollector.php, строка 0:
Превышено максимальное время выполнения 30 секунд
Тем не менее, если я перехожу на return $this->belongsTo(Npc::class, 'npc_id_fk', 'npc_id');
, запускается запрос where "npcstarget"."npc_id_fk" in ('')
. Почему время ожидания браузера истекло?
Переход по следующему маршруту с отношением NpcTarget
, определенным как $this->belongsTo(Npc::class, 'npc_id_fk', 'npc_id');
:
Route::get('/quest', function () {
$quest = Quest::findOrFail(1)->get();
});
Я получаю Вывод DebugBar:
select * from "quests" where "quests"."id" = '1' limit 1
select * from "tasks" where "tasks"."quest_id" in ('1')
select "npcs".*, "task_npcs"."task_id" as "pivot_task_id", "task_npcs"."npc_id" as "pivot_npc_id" from "npcs" inner join "task_npcs" on "npcs"."id" = "task_npcs"."npc_id" where "task_npcs"."task_id" in ('1', '2', '3')
select * from "npcstarget" where "npcstarget"."npc_id_fk" in ('')
При достижении того же маршрута с отношением NpcTarget
, определенным как $this->belongsTo(Npc::class, 'npc_id_fk', 'id');
, время ожидания истекло без вывода запроса.
Модели:
Quest:
class Quest extends BaseModel
{
protected $with = ['tasks'];
public function tasks()
{
return $this->hasMany(Task::class);
}
...
}
Задача:
class Task extends BaseModel
{
protected $with = ['npcs'];
public function npcs()
{
return $this->belongsToMany(Npc::class, 'task_npcs');
}
...
}
Npc:
class Npc extends BaseModel
{
protected $with = ['npcstarget'];
public function npcstarget()
{
return $this->hasMany(NpcTarget::class, 'npc_id_fk', 'id');
}
}
NpcTarget:
class NpcTarget extends Npc
{
protected $table = 'npcstarget';
public function npc()
{
// If this: Times out
return $this->belongsTo(Npc::class, 'npc_id_fk', 'id');
// If this: Shows above "where "npcstarget"."npc_id_fk" in ('')"
return $this->belongsTo(Npc::class, 'npc_id_fk', 'npc_id');
}
}