web-dev-qa-db-ja.com

複数の列を取り出しますか?

複数の列でpluckを使用すると、これが得られます:

{"Kreis 1 \/ Altstadt":"City","Kreis 2":"Enge","Kreis 3":"Sihifeld","Kreis 4":"Hard","Kreis 5 \/ Industriequartier":"Escher Wyss","Kreis 6":"Oberstrass","Kreis 7":"Witikon","Kreis 8 \/ Reisbach":"Weinegg","Kreis 9":"Altstetten","Kreis 10":"Wipkingen","Kreis 11":"Seebach","Kreis 12 \/ Schwamendingen":"Hirzenbach"

しかし、私はこれが必要ですか?

["Rathaus","Hochschulen","Lindenhof","City","Wollishofen","Leimbach","Enge","Alt-Wiedikon","Friesenberg","Sihifeld","Werd","Langstrasse","Hard","Gewerbechule","Escher Wyss","Unterstrass","Oberstrass","Fluntern","Hottingen","Hirslanden","Witikon","Seefeld","M\u00fchlebach","Weinegg","Albisrieden","Altstetten","H\u00f6ngg","Wipkingen","Affoltern","Oerlikon","Seebach","Saatlen","Schwamendingen-Mitte","Hirzenbach"]

どのように提案できますか?これは私の方法です:

    public function autocomplete_districts(Request $request)
   {
      $district = $request->input('query');
      // $ass = /DB::table('districts')->select(array('district', 'region'))->get();
      // dd($ass);
      $data = Districts::whereRaw('LOWER(district) like ?', [strtolower('%'.$district . '%')])->orWhereRaw('LOWER(region) like ?', [strtolower('%'.$district . '%')])->pluck('region','district');

      return response()->json($data);
   }
9
None

Cosは、pluckの仕組みです。代わりにこれを試してください。

$data = Districts::whereRaw('LOWER(district) like ?', [strtolower('%'.$district . '%')])->orWhereRaw('LOWER(region) like ?', [strtolower('%'.$district . '%')])->select('region', 'district')->get();

$data = collect($data->toArray())->flatten()->all();

select()get()とともに使用し、後で必要に応じてオブジェクトを変更する必要があります。

代わりに:->pluck('region','district'); use:->select('region','district')->get();

pluck()は、1つの列の値のみが必要な場合に推奨されます。

そして、可能な限り、モデルを複数形(Districts)ではなく単数形にする必要があります-Laravel nomenclature。

18
Learner

これは私が常に直面している問題であり、モデルまたはアレイで使用できる次のソリューションを作成することになりました。
また、必要に応じて多次元配列を作成するドット構文のサポートがあります。

AppServiceProvider(または任意のプロバイダー)内にこのマクロを登録します。

/**
 * Similar to pluck, with the exception that it can 'pluck' more than one column.
 * This method can be used on either Eloquent models or arrays.
 * @param string|array $cols Set the columns to be selected.
 * @return Collection A new collection consisting of only the specified columns.
 */
    Collection::macro('pick', function ($cols = ['*']) {
    $cols = is_array($cols) ? $cols : func_get_args();
    $obj = clone $this;

    // Just return the entire collection if the asterisk is found.
    if (in_array('*', $cols)) {
        return $this;
    }

    return $obj->transform(function ($value) use ($cols) {
        $ret = [];
        foreach ($cols as $col) {
            // This will enable us to treat the column as a if it is a
            // database query in order to rename our column.
            $name = $col;
            if (preg_match('/(.*) as (.*)/i', $col, $matches)) {
                $col = $matches[1];
                $name = $matches[2];
            }

            // If we use the asterisk then it will assign that as a key,
            // but that is almost certainly **not** what the user
            // intends to do.
            $name = str_replace('.*.', '.', $name);

            // We do it this way so that we can utilise the dot notation
            // to set and get the data.
            array_set($ret, $name, data_get($value, $col));
        }

        return $ret;
    });
});

これは、次の方法で使用できます。

$a = collect([
    ['first' => 1, 'second' => 2, 'third' => 3],
    ['first' => 1, 'second' => 2, 'third' => 3]
]);

$b = $a->pick('first', 'third'); // returns [['first' => 1, 'third' => 3], ['first' => 1, 'third' => 3]]

またはさらに、あなたが持っているかもしれないモデルで:

$users = User::all();
$new = $users->pick('name', 'username', 'email');
// Might return something like:
// [
//     ['name' => 'John Doe', 'username' => 'john', 'email' => '[email protected]'],
//     ['name' => 'Jane Doe', 'username' => 'jane', 'email' => '[email protected]'],
//     ['name' => 'Joe Bloggs', 'username' => 'joe', 'email' => '[email protected]'],
// ]

また、ドット表記を使用したり、as [other name]構文を使用したりして、関係を参照することもできます。

$users = User::all();
$new = $users->pick('name as fullname', 'email', 'posts.comments');
// Might return something like:
// [
//     ['fullname' => 'John Doe', 'email' => '[email protected]', 'posts' => [...]],
//     ['fullname' => 'Jane Doe', 'email' => '[email protected]', 'posts' => [...]],
//     ['fullname' => 'Joe Bloggs', 'email' => '[email protected]', 'posts' => [...]],
// ]
2
JustCarty

モデルスコープを作成しました

スコープの詳細:

コード:

/**
 * Scope a query to Pluck The Multiple Columns
 *
 * This is Used to Pluck the multiple Columns in the table based
 * on the existing query builder instance
 *
 * @author Manojkiran.A <[email protected]>
 * @version 0.0.2
 * @param  \Illuminate\Database\Eloquent\Builder $query
 * @param string $keyColumn the columns Which is used to set the key of array
 * @param array $extraFields the list of columns that need to plucked in the table
 * @return \Illuminate\Support\Collection
 * @throws Illuminate\Database\QueryException
 **/
public function scopePluckMultiple( $query, string $keyColumn, array $extraFields):\Illuminate\Support\Collection
{
    //pluck all the id based on the query builder instance class
    $keyColumnPluck = $query->pluck( $keyColumn)->toArray();
    //anonymous callback method to iterate over the each fileds of table
    $callBcakMethod = function ($eachValue) use ($query)
    {
        $eachQuery[$eachValue] = $query->pluck( $eachValue)->toArray();
        return $eachQuery;
    };
    //now we are collapsing the array single time to get the propered array 
    $extraFields = \Illuminate\Support\Arr::collapse( array_map($callBcakMethod, $extraFields));

    // //iterating Through All Other Fields and Plucking it each Time
    // foreach ((array)$extraFields as  $eachField) {
    //         $extraFields[$eachField] =   $query->pluck($eachField)->toArray();
    //     }

    //now we are done with plucking the Required Columns
    //we need to map all the values to each key

    //get all the keys of extra fields and sets as array key or index
    $arrayKeys = array_keys($extraFields);
    //get all the extra fields array and mapping it to each key
    $arrayValues = array_map(
        function ($value) use ($arrayKeys) {
            return array_combine($arrayKeys, $value);
        },
        call_user_func_array('array_map', array_merge(
            array(function () {
                return func_get_args();
            }),
            $extraFields
        ))
    );
    //now we are done with the array now Convert it to Collection
    return collect( array_combine( $keyColumnPluck, $arrayValues));
}

だから今テスト部分

基本的な例

$basicPluck  = Model::pluckMultiple('primaryKeyFiles',['fieldOne', 'FieldTwo']);

高度な例

$advancedPlcuk  = Model::whereBetween('column',[10,43])
                            ->orWhere('columnName','LIKE', '%whildCard%')
                            ->Where( 'columnName', 'NOT LIKE', '%whildCard%')
                            ->pluckMultiple('primaryKeyFiles',['fieldOne', 'FieldTwo']);

ただし、\ Illuminate\Support\Collectionを返すため、配列に変換する必要がある場合

$toArrayColl = $advancedPluck->toArray();

jSONに変換する必要がある場合

$toJsonColl = $advancedPluck->toJson();
0
Manojkiran.A

Laravel:個別の配列の複数列を摘み取るには、次のコードを使用します。

$Ads=Ads::where('status',1);
$Ads=$Ads->where('created_at','>',Carbon::now()->subDays(30));
$activeAdsIds=$Ads->pluck('id'); // array of ads ids
$UserId=$Ads->pluck('user_id'); // array of users ids
0
Adnan Ahmad

LARAVEL 5.6:

こんにちは、私は同じ問題を抱えており、1つの選択リストに2つの列を結合する必要がありました。私のDBには、ユーザー用の2つの列first_nameとlast_nameがあります。ユーザーのフルネームが表示され、IDが値として選択ボックスが必要です。これは、pluck()メソッドを使用して修正した方法です。

ユーザーモデルでは、フルネームアクセサー関数を作成しました。

public function getNameAttribute() {
    return ucwords($this->last_name . ' ' . $this->first_name);
}

その後、選択リストにフルネームと対応するデータベースIDを値として入力するために、ビューを返すコントローラーでこのコードを使用しました(アーカイブされているユーザーを表示せず、必要に応じてクエリの開始を変更できます) 、最も重要なのはget()およびpluck()関数です。

$users = User::whereNull('archived_at')
    ->orderBy('last_name')
    ->get(['id','first_name','last_name'])
    ->pluck('name','id');
return view('your.view', compact('users'));

これで、選択リストで$ usersを使用できます!

最初に、必要なすべての値をDBから取得します。その後、PLUCKメソッドで使用するために定義されたアクセサ属性を使用できます。

アクセサーに必要なすべての列がGETにある限り;-)

0
David Notrac