2017-10-29 5 views
1

モデルをインスタンス化するときに自動的にリレーションを呼びたいと思っています。今のところ、私のモデルは次のようになります。ララベルEloquentモデル__constructメソッドを呼び出す方法

class AdminLog extends Model{ 
    public function __construct(){ 
     $this->belongsTo('App\User', 'admin_id'); 
    } 
} 

が、私はdd(AdminLog::get()->first());をしようとするとき、それはどんな関係を示しているdoesntの。

編集#1:parent::__construct();をモデルの__constructメソッドに追加しようとしましたが、機能しませんでした。

答えて

2

belongsTo()は、と定義されていますが、ロードされません。

最初にリレーションシップを定義する必要があります。その後、loadメソッドを使用して、いつでもロードできます。

class AdminLog extends Model { 
    public function user() { 
     return $this->belongsTo(\App\User::class, 'admin_id'); 
    } 
} 

$log = AdminLog::first(); 
$log->load('user'); 

コンストラクタの内部にロードすることは可能ですが、そのことを強く推奨します。 20個のAdminLogオブジェクトがある場合、オブジェクトごとに1回、データベースに20回クエリを実行します。それは非効率的です。

代わりに何をする必要があります使用eager loadingです。これにより、すべての20の管理ログについて、のユーザテーブルがに一度だけクエリされます。これを行うにはさまざまな方法がありますが、ここに例があります:

$logs = AdminLog::take(20) 
    ->with('user') 
    ->get(); 
dd($logs->toArray()); 
関連する問題