如何在Laravel 4中查询和过滤软删除的雄辩模型

如何在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为空,因为它已被软删

使用来自的Laravel 4.1初学者工具包,我有两个模型:类别和兴趣。两者都是软可删除的。我希望索引视图根据用户的愿望显示3个不同的列表:“全部显示”、“显示已删除”和“显示未删除”。 一切都很好,直到我为他们之间的关系添加了HasMany/belongs

型号:

现在,当视图对属于软删除类别的兴趣调用
$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;