这个问题困扰了我好几天,直到现在我都无法解决这个问题,所以我不得不寻求帮助。
以下是相关的代码段:
模型 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');
}
答案 0 :(得分:0)
问题是$this->newProduct()->first()->id
:您无法使用依赖于模型的属性进行预先加载。
您必须使用JOIN解决方案。