2014-02-25 26 views
38

Ich habe eine Tabelle namens tenantdetails dieWie verketten Spalten mit Laravel 4 eloquent?

Tenant_Id | First_Name | Last_Name | ........ 

enthält, und ich will über die Verkettungsfunktion von MySQL First_Name und Last Name als eine Spalte abzurufen. Also schreibe ich in meinem controller wie folgt

$tenants = Tenant::orderBy('First_Name')->lists('CONCAT(`First_Name`," ",`Last_Name`)','Tenant_Id'); 

aber ergibt sich die folgende Fehlermeldung:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error 
in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near '`," ",`First_Name`)`, 
`Id` from `tenantdetails` order by `F' at line 1 

(SQL: select `CONCAT(`First_Name`," ",`Last_Name`)`, `Id` 
from `tenantdetails` order by `First_Name` asc). 

Wie können wir die Backticks zu vermeiden, während eine Funktion von MySQL in Laravel Eloquent aufrufen. Ich interessiere mich nur für Eloquent (nicht in fließender Anfrage). Danke im Voraus.

aktualisieren

Dank @Andreyco für mich zu helfen. Wir können dies in einer eleganteren Weise erreichen, wie unten mit Laravel Modellen:

In unserem model:

public function getTenantFullNameAttribute() 
{ 
    return $this->attributes['First_Name'] .' '. $this->attributes['Last_Name']; 
} 

und in unserem controller:

$tenants = Tenant::orderBy('First_Name')->get(); 
$tenants = $tenants->lists('TenantFullName', 'Tenant_Id'); 
+0

Diese vorbildliche Lösung ist ehrfürchtig. Ist das irgendwo in der Dokumentation? –

+0

@Kyle Ridolfo. Vielen Dank. Eigentlich vergesse ich die Quelle für die Lösung. Aber ich bin mir sicher, dass ich bis zu diesem Tag nicht auf der Dokumentation nach der Lösung gesucht habe. – manuthalasseril

Antwort

59
Tenant::select('Tenant_Id', DB::raw('CONCAT(First_Name, " ", Last_Name) AS full_name')) 
    ->orderBy('First_Name') 
    ->lists('full_name', 'Tenant_Id'); 
+4

Ist eine Möglichkeit, dies nur mit eloquenten Orm zu tun – manuthalasseril

+1

Ich bin ein Anfänger zu Laravel. Ich denke, es ist eine Kombination von Fluent Query Builder mit Eloquent. Liege ich falsch? – manuthalasseril

+0

Das ist eloquent. In Eloquent können Sie alles von Fluent verwenden. Aber es ist immer noch redegewandt, egal was. Warum reicht das nicht für dich? – Andreyco

7

Ein Einfacher Weg ist selectRaw zu verwenden. Es wurde in Jan 30, 2014

Source

Tenant::selectRaw('CONCAT(First_Name, " ", Last_Name) as TenantFullName, id')->orderBy('First_Name')->lists('TenantFullName', 'id')) 
verwendet
2

Listen() Methode von Tailor implementiert auszuwählen Spalte von ausgewähltem Ergebnis. So erster Kontakt Vorname und Nachname und geben diese Spalte mit neuen Alias-Namen in select-Anweisung

$tenants = Tenant::orderBy('First_Name')->select(DB::row('CONCAT(`First_Name`," ",`Last_Name`) as name'),'Tenant_Id')->lists('name', 'id'); 

dann können Sie dieses Alias ​​in Listen auswählen() -Methode

2

Sie sollen die DB verwenden :: raw() zu concat die von Feld

Tenant::select(
      'Tenant_Id', 
      DB::raw('CONCAT(First_Name,"-",Last_Name) as full_name') 

     ) 
     ->orderBy('First_Name') 
     ->lists('full_name', 'Tenant_Id');