【问题标题】:How to query and filter soft-deleted Eloquent models in Laravel 4如何在 Laravel 4 中查询和过滤软删除的 Eloquent 模型
【发布时间】: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


    【解决方案1】:

    急切负载类别:

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

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

    Interest::with('category')->has('category')->get();
    

    【讨论】:

    • 答案的第二部分有效,您将获得加分。不幸的是,我的问题的主要部分仍然存在。 $interests = Interest::with('category')->onlyTrashed()->get(); 加载所有已删除的兴趣,并预加载其类别。问题是它只预加载未删除的类别。所以视图仍然中断。即使删除了这些类别,我也想加载兴趣并预加载类别。这里onlyTrashed() 应用于查询的兴趣部分。
    • 然后改写你的问题,因为这不是你想要的。无论如何,请检查编辑以了解如何在急切加载查询上应用任何内容。请注意,您仍然可以拥有没有 category 相关的 interest(无论是否删除),所以基本上您无论如何都想检查该关系上的 null..
    • 谢谢,这正是我想要的。出于好奇,你会如何表达这个问题?
    【解决方案2】:

    感谢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);
    

    【讨论】:

      【解决方案3】:

      而不是:

      SoftDeleted = true;
      

      使用:

      use SoftDeletes;
      

      这项工作对我来说很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2021-09-18
        • 2017-01-04
        相关资源
        最近更新 更多