使用来自https://github.com/snipe/laravel4-starter的Laravel 4.1起始套件,我有2个模型:类别和兴趣。两者都可以软删除。我希望索引视图根据用户的愿望显示3个不同的列表:“显示全部”,“显示已删除”和“显示未删除”。
一切都很好,直到我在它们之间添加了HasMany / BelongsTo关系。
模型:
class Category extends Elegant
{
protected $softDelete = true;
public function interests()
{
return $this->hasMany('Interest');
}
}
class Interest extends Elegant
{
protected $softDelete = true;
public function category()
{
return $this->belongsTo('Category');
}
}
现在,当视图调用属于已软删除的分类的兴趣$interest->category->name
时,会出现ErrorException: Trying to get property of non-object
。我怀疑这是因为$interest->category
为空,因为它已被软删除而没有被加载。
控制器:
class InterestsController extends AdminController
{
public function getIndex()
{
$showDisabled = Utility::GetShowDisabled();
switch ($showDisabled) {
case 'only':
// How to load *only* soft-deleted Interest with their categories
// even if the category has been soft-deleted?
$interests = Interest::onlyTrashed()->orderBy('name')->paginate(10);
break;
case 'with':
// How to load *all* Interests with their categories
// even if the category has been soft-deleted?
$interests = Interest::withTrashed()->orderBy('name')->paginate(10);
break;
default:
// How to load *only* *NON-soft-delted* Interests with their categories
// even if the category has been soft-deleted?
$interests = Interest::orderBy('name')->paginate(10);
break;
}
return View::make('backend/interests/index', compact('interests', 'showDisabled'));
}
请看switch语句中每个区块的问题。我怀疑解决方案可能涉及某种急切加载,但即使经过了一些非常激烈的谷歌搜索和试验,正确的咒语仍然使我困惑...
额外加分:如何加载所有未被软删除的兴趣,并过滤掉具有已软删除类别的兴趣?
谢谢。
$interests = Interest::with('category')->onlyTrashed()->get();
加载了所有被删除的兴趣,并预加载它们的类别。问题在于它只预加载了未删除的类别。因此视图仍然无法正常显示。我希望即使这些类别已被删除,也能加载兴趣并预加载类别。在这里,onlyTrashed()
应用于查询中的 Interest 部分。 - CodeMonkey