Загрузка вложенных Laravel не может работать как ожидалось - PullRequest
0 голосов
/ 03 мая 2018

Эта проблема беспокоила меня в течение многих дней, я не могу решить эту проблему до сих пор, поэтому я должен обратиться за помощью.

Ниже приведен фрагмент кода:

Модель Категория.php

public function child()
{
    return $this->hasMany('App\Http\Models\Category', 'pid', 'id');
}

public function logs()
{
    return $this->hasMany('App\Http\Models\Log', 'cate_id');
}

public function products()
{
    return $this->hasMany('App\Http\Models\Product', 'cate_id');
}

public function newProduct()
{
    return $this->products()->orderBy('created_at', 'desc');
}

public function latestLog()
{
    return $this->logs()->where([
               'product_id' => $this->newProduct()->first()->id,
               'status'     => 1,
           ])->orderBy('created_at', 'desc');
}

Контроллер CategoryController.php

public function getLatestLog()
{
    // Category with id 1 with nested eager loading
    $subCategory = Category::find(1)
                   ->with(['child.newProduct', 'child.latestLog'])
                   ->first()->child;

    // Get latest log for subCategory with id 3
    dd($subCategory->find(3)->latestLog);
}

В этом случае я хочу использовать вложенную нетерпеливую загрузку, чтобы получить последний журнал. Но меня беспокоит то, что когда я добавляю child.checkLatestLog, он просто выводит пустой, но когда я его удаляю, он выводит нормально.

Я думаю, что проблема связана с переменной $this->newProduct()->first()->id. Поскольку я попытался вручную ввести идентификатор продукта, который существует в таблице журнала, он работал нормально.

Это может быть моя вина, но я не знаю, где это было не так. Я хотел бы поблагодарить вас за обращение за помощью.


обновление

Решение этого вопроса:

public function latestLog()
{
    return $this->hasManyThrough(
        'App\Http\Models\Log',
        'App\Http\Models\Product',
        'cate_id',
        'product_id',
        'id',
        'id'
    )->orderBy('created_at', 'desc');
}

1 Ответ

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

Проблема в $this->newProduct()->first()->id: вы не можете использовать готовую загрузку с такими зависимыми от модели атрибутами, как этот.

Вам придется использовать решение JOIN.

...