it-swarm.com.de

Laravel 5.1: Handle-Joins mit gleichen Spaltennamen

Ich versuche folgende Dinge aus der Datenbank abzurufen:

  • nutzername
  • benutzer-Avatar-Name
  • benutzer avatar_filetype
  • vollständige Gesprächsnachrichten

mit der folgenden Abfrage:

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

Es funktioniert soweit gut, aber der Spaltenname des Avatars lautet 'name' wie der Spaltenname aus der 'users'-Tabelle. Wenn also diese Abfrage verwendet wird, um die Ausgabe über $conversation->name abzurufen, überschreibt der avatar.name den users.name.

Gibt es eine Möglichkeit, die Abfrageausgabe umzubenennen wie das mysql "as" -Feature bei laravel 5.1?

Zum Beispiel:

$conversation->avatarName

$conversation->userName
13

Meh okay .. ich habe eine einfache Lösung gefunden hier

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

Wie bereits erwähnt, habe ich das angeforderte "as-Feature" neben dem table.columnName hinzugefügt

31

Schauen Sie sich dieses Beispiel an, bei dem Sie versuchen, drei Tabellenstab, Kunden und Buchungen zusammenzuschalten (Pivot-Tabelle). 

 $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

Ich hatte folgendes Problem, vereinfachtes Beispiel:

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

$result ist eine Sammlung von Donation-Modellen. ABER VORSICHTIG:

beide Tabellen haben eine 'Created_at'-Spalte. Welcher created_at wird nun beim $result->created_at angezeigt? ich weiß es nicht. Es scheint, dass eloquent beim Join einen impliziten select * ausführt und Modelle Donation zurückgibt, jedoch mit zusätzlichen Attributen. created_at scheint zufällig. Was ich also wirklich wollte, ist eine Rückgabe aller Donation Modelle des Benutzers mit E-Mail [email protected]

lösung ist dies:

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

Ja, benennen Sie einfach die Spalte in einer der beiden Tabellen um und es sollte funktionieren. Außerdem können Sie die Spalte user.name in irgendetwas umbenennen. Außerdem können Sie die Senderspalte von conversation_messages in id umbenennen und einen natürlichen Join ausführen. 

0
Yogesh kumar