laravelを使用してMySQLデータベースから単一の値を取得しようとしていますが、配列を取得している問題です。これはMySQLコマンドラインでの私のクエリ結果です:
select groupName from users;
+-----------+
| groupName |
+-----------+
| Admin |
+-----------+
私のlaravel関数:
public static function PermitAddNewUser(){
$username=Session::get('key');
$data=DB::select("select groupName from users where username='$username';");
return $data;
}
予期される$ data値は、value = Adminの文字列です
しかし、私が得るのは[{"groupName":"Admin"}]
編集:
申し訳ありませんが、多くの人がコメントしているようにpluck()を忘れました:最も簡単な方法は:
return DB :: table( 'users')-> where( 'username'、$ username)-> pluck( 'groupName');
要求された行の最初の結果のみを文字列として直接返します。
Fluent Query Builderを使用すると、とにかく配列を取得できます。つまり、クエリビルダーには、そのクエリから返される行数がわからないということです。少しきれいにするためにできることは次のとおりです
$ result = DB :: table( 'users')-> select( 'groupName')-> where( 'username'、$ username)-> first();
First()はqueryBuilderに1行のみを返すように指示しているため、配列はありません。
return $ result-> groupName;
それが役に立てば幸い
まだ別の編集:バージョン5.2pluck
はnot廃止され、新しい動作になりました(以前のlists
と同じ-サイドノートを参照)未満):
編集:バージョン5.1pluck
は非推奨です。そのため、代わりにvalue
の使用を開始してください。
DB::table('users')->where('username', $username)->value('groupName');
// valid for L4 / L5.0 only
DB::table('users')->where('username', $username)->pluck('groupName');
これは、見つかった最初の行のgroupName
フィールドの単一の値を返します。
SIDE NOTE reg。@TomasButeler comment:Laravelは賢明なバージョン管理に従っていないため、このような場合があります。この回答を書いている時点で、クエリからSINGLE値を取得するpluck
メソッドがありました(Laravel 4. *&5.0)。
次に、L5.1のpluck
は非推奨になり、代わりにvalue
メソッドを使用して置き換えました。
しかし、面白くするために、pluck
は実際にはなくなりませんでした。代わりに、まったく新しい動作が行われ、... lists
メソッドが非推奨になりました。(L5.2)-クエリビルダーとコレクションメソッドの不整合が原因で発生しました(5.1でpluck
はコレクションとクエリで異なる動作をしました。これが理由です) 。
Laravel> = 5.3の時点で、最善の方法はvalueを使用することです:
$groupName = \App\User::where('username',$username)->value('groupName');
または
use App\User;//at top of controller
$groupName = User::where('username',$username)->value('groupName');//inside controller function
もちろん、ユーザーテーブルのモデルユーザーを作成する必要があります。これは、Laravelのデータベーステーブルと対話する最も効率的な方法です。
[EDIT]pluck
関数の期待される出力は、Laravel 5.1から5.2に変更されました。したがって、なぜ 5.1では非推奨としてマークされています
Laravel 5.1 では、pluck
はクエリの最初の結果から単一の列の値を取得します。
Laravel 5.2 で、pluck
は、指定された列の値を含む配列を取得します。そのため、非推奨ではなくなりましたが、以前のようには動作しなくなりました。
したがって、最初の行の1列が必要で、Laravel 5.1以降を使用している場合は、value
関数を使用するのが簡単な答えです。
コメントでこれを指摘してくれたTomas Butelerに感謝します。
[ORIGINAL]Laravel 5.1を使用しているこの質問に出くわした人のために、 pluck()は廃止されました そしてLaravel 5.2で完全に削除されます。
代わりにvalue()
を使用して、将来コードを校正することを検討してください。
return DB::table('users')->where('username', $username)->value('groupName');
クエリビルダーを使用して、groupNameなどの単一列の値を取得します
$groupName = DB::table('users')->where('username', $username)->pluck('groupName');
Laravel 5.1の場合
$groupName=DB::table('users')->where('username', $username)->value('groupName');
または、ユーザーモデルを使用して、単一の列の値を取得します
$groupName = User::where('username', $username)->pluck('groupName');
または、最初の行を取得してから、単一の列の値を取得するために分割します
$data = User::where('username', $username)->first();
if($data)
$groupName=$data->groupName;
laravel 5.6では、非常に簡単な解決策があります。
User::where('username', $username)->first()->groupName;
groupNameを文字列として返します。