2016-03-23 10 views
0

Eloquentモデルを使用して単一テーブル継承を実装しました。これで、親モデルと子モデルに基づいてデータベースを並べ替えて検索できます。私はこれを達成するためにpolymorphic relationsを使用しました。Eloquentを使用した単一のテーブル継承構造の並べ替えと検索

基本モデルにはモーフィング方法しかありません。

class Item extends Model 
{ 
    public function extended() 
    { 
     return $this->morphTo(); 
    } 
} 

私は$items = Item::with('extended')->get();を使用するすべての項目を一覧表示したい場合は、私が唯一たい場合は項目がいくつかの基本的な性質

abstract class ExtendedItem extends Model 
{ 
    /** 
    * The relationships to always load with the model 
    * 
    * @var array 
    */ 
    protected $with = ['item']; 

    /** 
    * The accessors to append to the model's array form. 
    * 
    * @var array 
    */ 
    protected $appends = ['title']; 

    /** 
    * The attributes that should be hidden for arrays. 
    * 
    * @var array 
    */ 
    protected $hidden = ['item']; 

    public function getTitleAttribute() 
    { 
     return $this->item->title; 
    } 

    public function item() 
    { 
     return $this->morphOne('App\Item', 'extended'); 
    } 
} 

例の子クラス

class Foo extends ExtendedItem 
{ 
    public function bars() 
    { 
     return $this->hasMany('App\Bar')->orderBy('bar_col1')->orderBy('bar_col2'); 
    } 
} 

class Bar extends ExtendedItem 
{ 
    public function foo() 
    { 
     return $this->belongsTo('App\Foo'); 
    } 
} 

を持って拡張するすべてのモデルは、私が使用するFooオブジェクトは$foos = Foo::all();です。


私は

$items = return Item::with('extended')->orderBy('title')->get();

を使用して、すべての項目のリストを注文することができますが、どのように私はタイトルでFOOSのリストを注文することができますか?どのようにしてタイトルで検索することができますか?好ましくは、生成されたクエリを用いてデータベース上で行われ、Eloquentコレクションでは行われないことが好ましい。

答えて

0

Laravelの多型関係のデフォルトのデータベース構造に従えば、whereHasを使用して結果をfooインスタンスに限定することができると思います。私は今テストするために、マシンへのアクセスを持っていないが、これは私がしようとするものである

$items = Item::whereHas('extended' => function ($q) { 
    $q->where('extended_type', 'foo'); 
})->with('extended')->orderBy('title')->get(); 
+0

を使用して行うことができ、私はあなたが '項目:: whereHas( '拡張'、機能($ qを){...})を意味推測する - >と... '。これは私に、 '列が見つからない:1054不明な列' self_18aab6fab05a597f53c25ac6f61ae312.id 'where句' ... 'というエラーを表示します。 –

+0

確かに、それは私の部分のタイプミスでした。私が言ったように、私は今これをテストすることができないので、私はこれが動作するかどうかはわかりませんが、私が最初に試してみたものです。) – Vercoutere

0

関連テーブルをソートするには、テーブルには、最初に参加しなければなりません。

return Foo::with('item') 
    ->join('items', 'items.extended_id', '=', 'foos.id') 
    ->orderBy('title', 'DESC') 
    ->get(); 

検索がwhereHas

return Foo::whereHas('item', function ($q) { 
    $q->where('title', 'LIKE', '%baz%'); 
})->get(); 
関連する問題