3

使用来自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 个部分中提出的问题。我怀疑该解决方案将涉及某种急切的加载,但即使经过一些非常激烈的谷歌搜索和实验,我仍然无法找到正确的咒语......

额外点:如何在过滤掉具有软删除类别的兴趣时加载所有非软删除的兴趣?

谢谢你。

4

3 回答 3

8

急切负载类别:

Interest::with(['category' => function ($q) {
   $q->withTrashed();
}])->onlyTrashed()->get();
// the same for other cases

具有以下类别的兴趣(未删除):

Interest::with('category')->has('category')->get();
于 2014-10-11T16:54:01.823 回答
0

感谢Jarek Tkaczyk的提示。对于其他人的完整参考,这里是我最终使用的代码位:

    $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);
于 2014-10-11T19:56:56.430 回答
0

代替 :

SoftDeleted = true;

利用:

use SoftDeletes;

这项工作对我来说很好。

于 2015-05-14T05:12:11.340 回答