如何在Laravel 4中查询和过滤软删除的雄辩模型
使用来自的Laravel 4.1初学者工具包,我有两个模型:类别和兴趣。两者都是软可删除的。我希望索引视图根据用户的愿望显示3个不同的列表:“全部显示”、“显示已删除”和“显示未删除”。 一切都很好,直到我为他们之间的关系添加了HasMany/belongs 型号: 现在,当视图对属于软删除类别的兴趣调用如何在Laravel 4中查询和过滤软删除的雄辩模型,laravel,laravel-4,eloquent,eager-loading,soft-delete,Laravel,Laravel 4,Eloquent,Eager Loading,Soft Delete,使用来自的Laravel 4.1初学者工具包,我有两个模型:类别和兴趣。两者都是软可删除的。我希望索引视图根据用户的愿望显示3个不同的列表:“全部显示”、“显示已删除”和“显示未删除”。 一切都很好,直到我为他们之间的关系添加了HasMany/belongs 型号: 现在,当视图对属于软删除类别的兴趣调用$interest->category->name时,所有操作都会引发ErrorException:尝试获取非对象的属性。我怀疑这是因为$interest->category为空,因为它已被软删
$interest->category->name
时,所有操作都会引发ErrorException:尝试获取非对象的属性。我怀疑这是因为$interest->category
为空,因为它已被软删除,因此未被加载
控制器:
请参阅switch语句的3个部分中的我的问题。我怀疑这个解决方案会涉及到某种急切的加载,但即使在经过一些相当激烈的谷歌搜索和实验后,正确的咒语仍然让我迷茫
额外要点:如何加载所有非软删除的兴趣,同时过滤掉具有软删除类别的兴趣
谢谢。紧急加载类别:
Interest::with(['category' => function ($q) {
$q->withTrashed();
}])->onlyTrashed()->get();
// the same for other cases
具有类别(未删除)的兴趣:
谢谢你的提示。
以下是我最后使用的代码,供其他人参考:
$query = Interest::with(array('category' => function ($subQuery) {
$subQuery->withTrashed();
}));
switch ($showDisabled) {
case 'only':
$query->onlyTrashed();
break;
case 'with':
$query->withTrashed();
break;
case 'without':
break;
default:
$showDisabled = "activeonly";
$query->has('category');
break;
}
$searchTerms = explode(' ', $searchQ);
$query->where( function ($subQuery) use ($searchTerms) {
$termCnt = 0;
foreach($searchTerms as $term)
{
(0 == $termCnt)
? $subQuery->Where('name', 'LIKE', '%'. $term .'%')
: $subQuery->orWhere('name', 'LIKE', '%'. $term .'%');
$termCnt++;
}
});
$interests = $query->orderBy($sortByCol, $order)->paginate(10);
而不是:
SoftDeleted = true;
使用:
这项工作对我来说很好。你得到了额外的分数,答案的第二部分很有效。不幸的是,我的主要问题仍然存在<代码>$interests=Interest::with('category')->onlyTrashed()->get()代码>加载所有已删除的兴趣,并预加载其类别。问题是它只预加载未删除的类别。因此,这一观点仍然存在分歧。我想加载的利益和预加载的类别,即使这些类别被删除。这里的onlyTrashed()
应用于查询的兴趣部分。然后重新表述您的问题,因为它不是您所要求的。无论如何,请检查编辑以了解如何在急切加载查询上应用任何内容。请注意,您仍然可以拥有没有相关类别的兴趣
(无论是否删除),因此基本上您希望检查该关系中的null
。谢谢,这正是我想要的。出于好奇,你会如何措辞这个问题?
Interest::with('category')->has('category')->get();
$query = Interest::with(array('category' => function ($subQuery) {
$subQuery->withTrashed();
}));
switch ($showDisabled) {
case 'only':
$query->onlyTrashed();
break;
case 'with':
$query->withTrashed();
break;
case 'without':
break;
default:
$showDisabled = "activeonly";
$query->has('category');
break;
}
$searchTerms = explode(' ', $searchQ);
$query->where( function ($subQuery) use ($searchTerms) {
$termCnt = 0;
foreach($searchTerms as $term)
{
(0 == $termCnt)
? $subQuery->Where('name', 'LIKE', '%'. $term .'%')
: $subQuery->orWhere('name', 'LIKE', '%'. $term .'%');
$termCnt++;
}
});
$interests = $query->orderBy($sortByCol, $order)->paginate(10);
SoftDeleted = true;
use SoftDeletes;