web-dev-qa-db-ja.com

Laravelリレーションからフィールドを抜き取る

関連するユーザーを持つセラーオブジェクトがあります。 LaravelCollectiveからselectを入力する必要があるため、次のようなものを作成する必要があります。

{!! Form::selectGroup('seller_id', 'Seller', Seller::with('user')->pluck('user.first_name', 'id')->toArray(), null) !!}

問題は、リレーションシップ(user.first_name)からフィールドを取得できないことです。

どうすればいいですか?

[〜#〜] update [〜#〜]

これを避けたい...

<?php 
    $sellers = [];

    Seller::with('user')->get()->each(function ($seller) use (&$sellers) {
        $sellers[$seller->id] = $seller->user->first_name;
    });
?>
25
Alan

Laravelの pluck メソッドを次のように使用できます。

$sellers = Seller::with('user')->get()->pluck('user.first_name', 'id')
38
Amit Gupta

join()pluck() を使用すると、次のように実現できます。

$s = Seller::join('users', 'sellers.user_id', '=', 'users.id')
          ->pluck('sellers.id', 'users.id')
          ->all();

これにより、次のような配列が得られます。

[
    'seller_id_1' => 'user_id_1',
    'seller_id_2' => 'user_id_2',
    'seller_id_3' => 'user_id_3',
    'seller_id_4' => 'user_id_4',
    'seller_id_n' => 'user_id_n',
];

お役に立てれば!

8
Saumya Rastogi

別の方法は、リレーションシップ内で必要な列を定義することです。特定のリレーションシップでこれらの列のみが常に必要な場合は便利です。例:

Class Seller extends Model {
    ...

    public function user()
    {
        return $this->hasOne(user::class, 'id')
            ->select('id', 'first_name');
    }
}
1
Vali Munteanu