2014-10-11 44 views
1

使用來自https://github.com/snipe/laravel4-starter的Laravel 4.1入門工具包,我有2個模型:類別和興趣。兩者都是可以刪除的。我希望索引視圖根據用戶的願望顯示3個不同的列表:「全部顯示」,「顯示刪除」和「顯示未刪除」。 一切都很好,直到我在它們之間添加了HasMany/BelongsTo關係。如何在Laravel 4中查詢和過濾軟刪除的Eloquent模型

機型:

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個部分。我懷疑這個解決方案會涉及到某種急切的加載,但即使經過一些非常強大的谷歌搜索和實驗,正確的咒語仍然沒有我....

特別要點:如何加載所有興趣是非 - 軟刪除同時過濾掉軟刪除類別的興趣?

謝謝。

回答

6

伊格負載類別:具有類別

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

利益(未缺失的):

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

你的答案的第二部分工作得到額外的分數。不幸的是我的問題的主要部分依然存在。 '$ interest = Interest :: with('category') - > onlyTrashed() - > get();'加載所有被刪除的興趣並預加載他們的類別。問題是它只預先加載未刪除的類別。所以這個觀點仍然存在。我想加載興趣並預加載類別,即使這些類別被刪除。這裏'onlyTrashed()'被應用到查詢的興趣部分。 – CodeMonkey 2014-10-11 17:53:27

+0

然後改述你的問題,因爲這不是你要求的。無論如何,檢查編輯如何在急切的加載查詢中應用任何內容。注意,你仍然可以擁有沒有'category'相關(無論是否被刪除)的'interest',所以基本上你想檢查那個關係上的'null'。 – 2014-10-11 18:07:51

+0

謝謝,那正是我的尋找。出於好奇,你會如何解釋這個問題? – CodeMonkey 2014-10-11 19:45:17

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); 
0

代替:

SoftDeleted = true; 

使用:

use SoftDeletes; 

這項工作的對我很好。

相關問題