web-dev-qa-db-fra.com

Laravel 5.1: gérer les jointures avec les mêmes noms de colonne

J'essaie d'extraire les éléments suivants de la base de données:

  • nom d'utilisateur
  • nom_avatar_utilisateur
  • utilisateur avatar_filetype
  • terminer conversation_messages

avec la requête suivante:

    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;
}

Cela fonctionne bien jusqu'à présent, mais le nom de colonne de l'avatar est 'name', tout comme le nom de colonne de la table 'users'. Donc, si j'utilise cette requête le pour obtenir la sortie via $conversation->name, le avatar.name remplace le users.name

Existe-t-il un moyen de renommer la sortie de la requête, telle que la fonction mysql "as" de laravel 5.1?

Par exemple:

$conversation->avatarName

$conversation->userName
13

Meh okay .. j'ai trouvé une solution simple ici

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

Comme vous pouvez le mentionner, j'ai ajouté le "as-Feature" demandé à côté de la table.columnName

31

Jetez un coup d'œil à cet exemple de tentative de joindre trois membres du personnel, clients et réservations (tableau croisé dynamique). 

 $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);
3
Chika Ugwuanyi

J'ai eu le problème suivant, exemple simplifié:

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

$result est une collection de Donation modèles. MAIS ATTENTION:

les deux tables ont une colonne 'created_at'. Maintenant quel created_at est affiché en faisant $result->created_at? Je ne sais pas. Il semble qu'éloquent utilise un select * implicite lors d'une jointure et renvoie des modèles Donation mais avec des attributs supplémentaires. created_at semble aléatoire. Donc, ce que je voulais vraiment, c’est un retour de tous les modèles Donation de l’utilisateur avec la messagerie [email protected]

la solution est la suivante:

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

Ouais, il suffit de renommer la colonne de l'une des tables et tout devrait fonctionner .. Vous pouvez également renommer la colonne user.name, renommer la colonne d'expéditeur de conversation_messages en id et effectuer une jointure naturelle. 

0
Yogesh kumar