web-dev-qa-db-ja.com

Laravel:MySQLクエリから単一の値を取得する

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

40
Osama Al-Banna

編集:

申し訳ありませんが、多くの人がコメントしているように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;

それが役に立てば幸い

45
elfif

まだ別の編集:バージョン5.2plucknot廃止され、新しい動作になりました(以前の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はコレクションとクエリで異なる動作をしました。これが理由です) 。

55
Jarek Tkaczyk

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のデータベーステーブルと対話する最も効率的な方法です。

17
Learner

[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');
5

クエリビルダーを使用して、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;
3
Majbah Habib

laravel 5.6では、非常に簡単な解決策があります。

User::where('username', $username)->first()->groupName;

groupNameを文字列として返します。