【发布时间】:2014-12-06 15:25:22
【问题描述】:
使用来自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 为 NULL,因为它已被软删除,因此未加载。
控制器:
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 语句的每 3 个部分中查看我的问题。我怀疑该解决方案将涉及某种急切加载,但即使经过一些非常激烈的谷歌搜索和实验,我仍然无法找到正确的咒语....
额外点:如何加载所有非软删除的兴趣同时过滤掉具有软删除类别的兴趣?
谢谢。
【问题讨论】:
标签: laravel laravel-4 eloquent eager-loading soft-delete