hasMany тайм-аут при получении принадлежащих моделей - PullRequest
0 голосов
/ 16 мая 2018

Из этой документации 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');
    }
}

1 Ответ

0 голосов
/ 16 мая 2018

Кажется, ошибка имела NpcTarget расширение Npc

class NpcTarget extends Npc
{
    protected $table = 'npcstarget';

    public function npc()
    {
        // If this: Times out
        return $this->belongsTo(Npc::class, 'npc_id_fk', 'id');
    }
}

Изменение на class NpcTarget extends BaseModel работает.

Я предполагаю, что это потому, что расширение Npc вызывает еще один with запрос к NpcTarget, создавая бесконечный цикл.

Я все еще хотел бы расширить родительскую модель, чтобы получить некоторые ее свойства.

...