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コレクションでは行われないことが好ましい。
を使用して行うことができ、私はあなたが '項目:: whereHas( '拡張'、機能($ qを){...})を意味推測する - >と... '。これは私に、 '列が見つからない:1054不明な列' self_18aab6fab05a597f53c25ac6f61ae312.id 'where句' ... 'というエラーを表示します。 –
確かに、それは私の部分のタイプミスでした。私が言ったように、私は今これをテストすることができないので、私はこれが動作するかどうかはわかりませんが、私が最初に試してみたものです。) – Vercoutere