Laravel嵌套的热切加载无法按预期工作

时间:2018-05-02 21:32:58

标签: laravel-5 eloquent laravel-5.4

这个问题困扰了我好几天,直到现在我都无法解决这个问题,所以我不得不寻求帮助。

以下是相关的代码段:

模型 Category.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变量有关。因为我试图手动输入日志表中存在的产品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 :(得分:0)

问题是$this->newProduct()->first()->id:您无法使用依赖于模型的属性进行预先加载。

您必须使用JOIN解决方案。