web-dev-qa-db-ja.com

Laravel 5 eloquentのCONCAT列

laravel初心者

目標は次のとおりです。2つの列があり、idの前にcomponent nameテーブル内の同じ行。

例(作業中)... Mysqlのような

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

そして出力は

ID

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

laravel雄弁な方法で、ここではコンポーネントがモデル名であるため、同じことが必要です。

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

しかし、それは機能しません。
構文が間違っているためだと思います。
親切に正しい構文を教えてください。 laravelModelsを使用します。

注:上記のクエリを作成し、これをインターネットで利用可能なものとして参照しました。

User::select(DB::raw('CONCAT(last_name, first_name) AS full_name'))
10
Eliyaz KL

クエリをDB::rawでラップする必要があります。

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

また、このようにクエリを実行しているため、このselectはselectステートメントから他のすべてのフィールドを削除するため、モデルの動作が異なる可能性があることに注意してください。したがって、新しいクエリがなければモデルから他のフィールドを読み取ることはできません。したがって、これはデータの変更ではなくデータの読み取りにのみ使用してください。

また、ニースリストに追加するには、クエリを次のように変更することをお勧めします。

$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.
30
Tschallacka

私は自分で答えを求めてこの投稿に来ました。私にとって唯一の問題は、答えが私の状況では実際には機能しなかったことです。多数のテーブルリレーションシップのセットアップがあり、子フィールドの1つに連結フィールドが必要です。 DB::raw解決策は私にとって面倒でした。私は検索を続け、必要な答えを見つけ、それがより簡単な解決策だと感じました。

の代わりに DB::rawEloquent Accessor を試すことをお勧めします。アクセサーを使用すると、モデル属性を取得し、元のモデルでは作成されない新しい属性を作成できます。

たとえば、基本的なUSER_PROFILEテーブルがあるとします。を含む id, first_name, last_name。ユーザーのフルネームを返すには、2つの名前属性をCONCATする必要があります。 USER_PROFILEモデルで作成したphp artisan make:model UserProfile、私は以下を配置します:

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

}

ここから、雄弁な呼び出しを行うと、その追加の属性アクセサーにアクセスできます。

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


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

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

しかし、私は1つの問題に遭遇したと言います。これは、例(id、ID)のように、同じ名前の変更された属性を作成しようとしていました。 id値自体を変更できますが、同じ名前を宣言したため、そのフィールド値へのアクセスのみを許可し、他のフィールドへのアクセスは許可していないようです。

他の人はそれができると言ったが、私はこの質問の正確な問題を解決することができなかった。

5
Bmoeller