Laravel 5.1: Joins mit gleichen Spaltennamen verarbeiten

Lesezeit: 3 Minuten

Ich versuche, folgende Dinge aus der Datenbank abzurufen:

  • Nutzername
  • Benutzer-avatar_name
  • Benutzeravatar_Dateityp
  • vollständige Konversationsnachrichten

mit folgender 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 ist ‘name‘ wie der Spaltenname aus dem ‘users‘ Tisch. Wenn ich also diese Abfrage verwende, um die Ausgabe über zu erhalten $conversation->namedas avatar.name überschreibt die users.name

Gibt es eine Möglichkeit, die Abfrageausgabe wie die mysql-Funktion “as” bei Laravel 5.1 umzubenennen?

Zum Beispiel:

$conversation->avatarName

$conversation->userName

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 Sie erwähnen können, habe ich das angeforderte “as-Feature” neben dem table.columnName hinzugefügt

  • schöne Lösung und unglaublich nützlich, damit Sie nicht eine Menge Daten erhalten, die Sie nicht benötigen. 4 Jahre nachdem du das gepostet hast, immer noch aktuell.

    – Logos_164

    7. August 2019 um 4:09 Uhr

  • Wie wählen wir dasselbe mit ‘selectRaw()’ aus?

    – Michel

    2. September 2020 um 19:23 Uhr

  • Schön und direkt.

    – Godwin

    15. September 2021 um 3:29 Uhr

Sehen Sie sich dieses Beispiel an, in dem versucht wird, drei Tabellen mit Mitarbeitern, Kunden und Buchungen (Pivot-Tabelle) zusammenzuführen.

 $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);

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 Modelle. ABER VORSICHT:

beide Tabellen haben eine ‘created_at’-Spalte. Nun welche created_at wird dabei angezeigt $result->created_at ? ich weiß nicht. Es scheint, dass eloquent etwas implizites tut select * beim Verbinden, Zurückgeben von Modellen Donation aber mit zusätzlichen Attributen. created_at scheint zufällig. Also, was ich wirklich wollte, ist eine Rückkehr von allem Donation Modelle des Benutzers mit E-Mail [email protected]

Lösung ist diese:

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

Ja, benennen Sie einfach die Spalte in einer der Tabellen um und es sollte funktionieren. Sie können auch die Spalte “user.name” in einen beliebigen Namen umbenennen, die Spalte “Sender” von “conversation_messages” in “id” umbenennen und eine natürliche Verknüpfung durchführen.

1180280cookie-checkLaravel 5.1: Joins mit gleichen Spaltennamen verarbeiten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy