4

Laravel 4 を使用し、User モデルにミューテーターを設定しました。

public function getFullnameAttribute($value)
{
    return $this->first_name. ' ' .$this->last_name;
}

しかし、Cars モデルに、その車にリンクされたユーザー ID の関係が設定されています。

public function salesManager()
{
    return $this->belongsTo('User', 'sales_manager')->select('first_name', 'last_name');
}

Car テーブルでその関係を呼び出しています。

$cars = Car::with('marqueBasic', 'modelBasic', 'salesManager')
    ->get();

さて、どうすればいいですか

$car->salesManager->fullname

現在は動作しません。これは、呼び出されているモデルとは別のモデルにあるためだと思いますか?

エラーは次のとおりです:「オブジェクト以外のプロパティを取得しようとしています」

間違った場所でミューテーターを呼び出していますか? 関係選択フィールドに入れてみましたが、フルネームのフィールド名も検索してエラーになりました。

4

1 に答える 1

1

考えられる理由は、関係のために取得するフィールドのリストを定義していることです。

その理由を理解するには、Eloquent がSalesManagerを使用してすべての Carをフェッチするように要求したときに、どのようにsalesManagerリレーションを熱心にロードするかを最初に理解する必要があります。Eloquent は、このような状況で次のことを行います。

  1. すべての車をロード
  2. 積載されたすべての車のsales_manager列の値を取得する
  3. ポイント 2 の値内に id を持つすべてのユーザーをロードします。
  4. 取得したユーザー モデルの ID と車の sales_manager 列を照合して、読み込まれたユーザー モデルを車にマップします。

ご覧のとおり、ステップ 4 は実行できません。ユーザーのidフィールドは、 salesManagerリレーションのためにフェッチされるフィールドのリストにリストされていないため、Eloquent は、熱心にsalesManagerをロードするときに、フェッチされたユーザーを車と一致させる方法がありません。salesManagerリレーションで参照しているフィールドをリストに追加する必要があります。

public function salesManager()
{
    return $this->belongsTo('User', 'sales_manager')->select('first_name', 'last_name', 'id');
}
于 2015-07-29T09:56:05.127 に答える