web-dev-qa-db-fra.com

CONCAT colonnes avec Laravel 5 éloquent

Considérez-moi comme débutant au laravel 

L’objectif est le suivant: j’ai deux colonnes, il me faut maintenant la variable id avec le préfixe component name de la même ligne de la table.

Par exemple (Travailler) ... J'ai Mysql aime

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

Et la sortie est

ID

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

J'ai besoin de la même manière éloquente laravel, comme ici composant est le nom du modèle. Alors j'ai essayé quelque chose comme

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

mais ça ne marche pas.
Je pense que la syntaxe est fausse.
Veuillez m'aider avec la syntaxe correcte. Utilisation de laravelModels.

Note: J'ai fait la requête ci-dessus, en se référant à ce qui est disponible sur Internet. 

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

Vous devez insérer votre requête dans DB::raw:

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

De plus, notez que, comme vous le faites avec votre requête, votre modèle peut se comporter différemment, car cette sélection supprime tous les autres champs de l'instruction select . Vous ne pouvez donc pas lire les autres champs de votre modèle sans une nouvelle requête. Donc, utilisez UNIQUEMENT ceci pour la lecture de données et non pour la modification de données.

Aussi, pour le faire dans une liste de Nice, je vous suggère de modifier votre requête pour:

$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

Je suis venu à ce post pour les réponses moi-même. Le seul problème pour moi est que la réponse n'a pas vraiment fonctionné pour ma situation. J'ai configuré de nombreuses relations de table et j'avais besoin que l'un des objets enfants ait un champ concaténé. La solution DB::raw était trop compliquée pour moi. J'ai continué à chercher et à trouver la réponse dont j'avais besoin et je pensais que c'était une solution plus facile.

Au lieu de DB::raw, je suggérerais d'essayer un Eloquent Accessor . Les accesseurs vous permettent de récupérer les attributs de modèle ET de créer de nouveaux attributs qui ne sont pas créés par le modèle d'origine.

Par exemple, supposons que j'ai une table USER_PROFILE de base. Il contient id, first_name, last_name. J'ai le besoin de concilier les deux attributs de nom pour renvoyer le nom complet de leur utilisateur. Dans le modèle USER_PROFILE que j'ai créé php artisan make:model UserProfile, je placerais les éléments suivants:

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

}

À partir de là, lorsque je passe des appels éloquents, j'ai maintenant accès à cet accesseur d'attribut supplémentaire.

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


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

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

Je dirai que j'ai toutefois rencontré un problème. Cela tentait de créer un attribut modifié portant le même nom, comme dans votre exemple (id, ID). Je peux modifier la valeur id elle-même, mais comme j'ai déclaré le même nom, il semble autoriser uniquement l'accès à cette valeur et à aucun autre champ.

D'autres ont dit qu'ils pouvaient le faire, mais j'étais incapable de résoudre ce problème, le problème EXACT.

1
Bmoeller