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()
しかし、それは機能しません。
構文が間違っているためだと思います。
親切に正しい構文を教えてください。 laravel
Models
を使用します。
注:上記のクエリを作成し、これをインターネットで利用可能なものとして参照しました。
User::select(DB::raw('CONCAT(last_name, first_name) AS full_name'))
クエリを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.
私は自分で答えを求めてこの投稿に来ました。私にとって唯一の問題は、答えが私の状況では実際には機能しなかったことです。多数のテーブルリレーションシップのセットアップがあり、子フィールドの1つに連結フィールドが必要です。 DB::raw
解決策は私にとって面倒でした。私は検索を続け、必要な答えを見つけ、それがより簡単な解決策だと感じました。
の代わりに DB::raw
、 Eloquent 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値自体を変更できますが、同じ名前を宣言したため、そのフィールド値へのアクセスのみを許可し、他のフィールドへのアクセスは許可していないようです。
他の人はそれができると言ったが、私はこの質問の正確な問題を解決することができなかった。