wake-up-neo.com

CONCAT-Säulen mit Laravel 5 eloquent

Betrachten Sie mich als Laravel-Anfänger 

Das Ziel ist: Ich habe zwei Spalten, jetzt muss die Variable id mit dem Code component name derselben Zeile in der Tabelle beginnen.

Zum Beispiel (arbeiten) ... Ich habe Mysql mögen

SELECT CONCAT(components.name," ", components.id) AS ID
FROM   `components` 

Und Ausgabe ist

ICH WÜRDE

|TestComp 40  |
 -------------
|component 41 |
 -------------
|test 42      |

Ich brauche dasselbe auf Laravel-eloquente Weise, da hier Component Model Name ist. Also habe ich so etwas ausprobiert

$comp=Component::select("CONCAT('name','id') AS ID")->get()

aber es geht nicht.
Ich denke, weil die Syntax falsch ist.
Helfen Sie mir bitte mit der richtigen Syntax. laravelModels verwenden.

Hinweis: Ich habe die obige Anfrage gemacht und diese als im Internet verfügbar bezeichnet. 

User::select(DB::raw('CONCAT(last_name, first_name) AS full_name'))
9
Eliyaz L

Sie müssen Ihre Abfrage in DB::raw einschließen:

$comp = Component::select(DB::raw("CONCAT('name','id') AS ID"))->get()

Beachten Sie außerdem, dass sich Ihr Modell möglicherweise anders verhält, weil Sie Ihre Abfrage so ausführen, da alle anderen Felder aus der select-Anweisung entfernt werden. Sie können also die anderen Felder nicht ohne eine neue Abfrage aus Ihrem Modell lesen. Verwenden Sie diese also NUR zum Lesen von Daten und nicht zum Ändern von Daten.

Um es in eine Nizza-Liste aufzunehmen, sollten Sie Ihre Abfrage folgendermaßen ändern:

$comp = Component::select(DB::raw("CONCAT('name','id') AS display_name"),'id')->get()->pluck('display_name','id');
// dump output to see how it looks.
dd($comp);// array key should be the arrray index, the value the concatted value.
20
Tschallacka

Ich bin selbst zu diesem Beitrag gekommen, um Antworten zu erhalten. Das einzige Problem für mich ist, dass die Antwort für meine Situation nicht wirklich funktioniert hat. Ich habe zahlreiche Tabellenbeziehungen eingerichtet und brauchte eines der untergeordneten Objekte, um ein verkettetes Feld zu haben. Die DB::raw-Lösung war für mich zu unordentlich. Ich suchte weiter und fand die Antwort, die ich brauchte, und finde, dass es eine einfachere Lösung ist.

Anstelle von DB::raw würde ich vorschlagen, einen Eloquent Accessor zu verwenden. Mithilfe von Accessoren können Sie Modellattribute abrufen UND neue erstellen, die nicht vom ursprünglichen Modell erstellt werden.

Nehmen wir beispielsweise an, ich habe eine grundlegende USER_PROFILE-Tabelle. Es enthält id, first_name, last_name. Ich muss die beiden Namensattribute CONCATIEREN, um den vollständigen Namen des Benutzers zurückzugeben. In dem von mir erstellten USER_PROFILE-Modell php artisan make:model UserProfile würde ich Folgendes einfügen:

class UserProfile extends Model
{

  /**
   * Get the user's full concatenated name.
   * -- Must postfix the Word 'Attribute' to the function name
   *
   * @return string
   */

  public function getFullnameAttribute()
  {
      return "{$this->first_name} {$this->last_name}";
  }

}

Von hier aus habe ich jetzt, wenn ich eloquente Anrufe tätige, Zugriff auf diesen zusätzlichen Attribut-Accessor.

| id | first_name | last_name |
-------------------------------
| 1  | John       | Doe       |


$user = App\UserProfile::first(); 

$user->first_name;   /** John **/
$user->fullname;    /** John Doe **/

Ich werde sagen, dass ich allerdings auf eine Ausgabe gestoßen bin. Es wurde versucht, ein modifiziertes Attribut mit demselben Namen wie in Ihrem Beispiel (ID, ID) zu erstellen. Ich kann den ID-Wert selbst ändern. Da ich jedoch denselben Namen deklariert habe, scheint er nur Zugriff auf diesen Feldwert und kein anderes Feld zu erlauben.

Andere haben gesagt, dass sie das können, aber ich konnte dieses Problem nicht lösen.

1
Bmoeller