web-dev-qa-db-ja.com

Laravel 5.1:同じ列名の結合を処理する

私はデータベースから次のものを取得しようとしています:

  • ユーザー名
  • ユーザーavatar_name
  • ユーザーavatar_filetype
  • conversation_messagesを完了する

次のクエリを使用します。

    static public function getConversation($id)
{
    $conversation = DB::table('conversation_messages')
        ->where('belongsTo', $id)
        ->join('users', 'conversation_messages.sender', '=', 'users.id')
        ->join('user_avatars', 'conversation_messages.sender', '=', 'user_avatars.id')
        ->select('users.name', 'conversation_messages.*', 'user_avatars.name', 'user_avatars.filetype')
        ->get();
    return $conversation;
}

これまでのところうまくいきますが、アバターの列名は 'name'テーブルの列名のように 'users'です。このクエリを使用して$conversation->nameを介して出力を取得する場合、avatar.nameusers.nameを上書きします

laravel 5.1でmysql "as"機能のようなクエリ出力の名前を変更する方法はありますか?

例えば:

$conversation->avatarName

$conversation->userName
16

まあ大丈夫..私は簡単な解決策を見つけました ここ

->select('users.name as userName', 'conversation_messages.*', 'user_avatars.name as avatarName', 'user_avatars.filetype')

言及できるように、要求された「as-Feature」をtable.columnNameの横に追加しました

37

3つのテーブルのスタッフ、顧客、および予約(ピボットテーブル)を結合しようとするこの例を見てください。

 $bookings = \DB::table('bookings')
        ->join('staffs', 'staffs.id' , '=', 'bookings.staff_id')
        ->join('customers', 'customers.id' , '=', 'bookings.customer_id')
        ->select('bookings.id', 'bookings.start_time',  'bookings.end_time', 'bookings.service', 'staffs.name as Staff-Name',  'customers.name as Customer-Name')
        ->orderBy('customers.name', 'desc')
        ->get();
    return view('booking.index')
            ->with('bookings', $bookings);
7
Chika Ugwuanyi

私は次の問題、簡単な例がありました:

$result = Donation::join('user', 'user.id', '=', 'donation.user_id')->where('user.email', '[email protected]')->first();

$resultDonationモデルのコレクションです。しかし注意:

両方のテーブルには、「created_at」列があります。今、どのcreated_atは、$result->created_at?知りません。雄弁は暗黙のselect *結合を実行し、モデルDonationを返しますが、追加の属性を使用します。 created_atはランダムに見えます。だから、私が本当に欲しかったのは、電子メールを持つユーザーのすべてのDonationモデルを返すことです[email protected]

解決策はこれです:

$result = Donation::select('donation.*')->join('user', 'user.id', '=', 'donation.user_id')->where('user.email', '[email protected]')->first();
1
Toskan

ええ、どちらかのテーブルの列の名前を変更するだけで機能します。また、できることは、user.name列の名前を任意に変更し、conversation_messagesのsender列の名前をidに変更して、自然な結合を実行することです。

0
Yogesh kumar