wake-up-neo.com

Mit mehreren Säulen zupfen?

Wenn ich mit mehreren Säulen zupfen, bekomme ich folgendes:

{"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"

Aber ich brauche das

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

Jeder Vorschlag, wie kann ich das tun? Das ist meine Methode:

    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);
   }
6
None

Denn so funktioniert Rupfen. Versuchen Sie es stattdessen.

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

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

Sie sollten select() mit get() verwenden und das Objekt später nach Bedarf ändern.

Anstelle von: ->pluck('region','district'); Verwende: ->select('region','district')->get();

pluck() wird empfohlen, wenn Sie nur den Wert einer Spalte benötigen.

Und so weit wie möglich sollten Ihre Modelle eine Singularform haben, nicht ein Plural (Bezirke) - zu folgen Laravel Nomenklatur.

15
Learner

Dies ist ein Problem, mit dem ich ständig konfrontiert bin, und ich habe die folgende Lösung entwickelt, die für Modelle oder Arrays verwendet werden kann.
Es gibt auch Unterstützung für Punktsyntax, mit der je nach Bedarf ein mehrdimensionales Array erstellt wird.

Registrieren Sie dieses Makro in der AppServiceProvider (oder einem beliebigen Anbieter Ihrer Wahl):

/**
 * 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;
    });
});

Dies kann dann auf folgende Weise verwendet werden:

$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]]

Oder zusätzlich bei allen Modellen, die Sie haben:

$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]'],
// ]

Es ist auch möglich, jede Beziehung mit der Punktnotation sowie mit der as [other name]-Syntax zu referenzieren:

$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

Laravel: Verwenden Sie den folgenden Code, um mehrere Spalten in separaten Arrays zu pflücken.

$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
1
Adnan Ahmad

Ich habe den Modellumfang erstellt

Weitere Informationen zu Bereichen:

Code:

/**
 * 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));
}

Also jetzt der Testteil

BASISBEISPIEL

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

ERWEITERTES BEISPIEL

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

Es wird jedoch das Verzeichnis \Illuminate\Support\Collection zurückgegeben, wenn Sie also in ein Array konvertieren müssen

$toArrayColl = $advancedPluck->toArray();

wenn Sie nach json konvertieren müssen

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

Meine Lösung in LARAVEL 5.6:

Hallo, ich hatte gerade das gleiche Problem, wo ich 2 Spalten in 1 Auswahlliste kombiniert brauchte .. Meine DB hat 2 Spalten für Benutzer: Vorname_Name und Nachname Ich brauche eine Auswahlbox mit den Benutzern voll Name sichtbar und die ID als Wert . So habe ich es mit der Methode pluck () behoben:

Im Benutzermodell habe ich eine vollständige Namenszugriffsfunktion erstellt:

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

Um die Auswahlliste mit dem vollständigen Namen und der entsprechenden Datenbank-ID als Wert zu füllen, habe ich diesen Code in meinem Controller verwendet, der die Ansicht zurückgibt (ohne die archivierten Benutzer anzuzeigen. Sie können jedoch den Beginn der Abfrage ändern, wenn Sie möchten Am wichtigsten sind die Funktionen get () und pluck ():

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

Jetzt können Sie die $ Benutzer in Ihrer Auswahlliste verwenden!

Zuerst erhalten Sie alle Werte aus der Datenbank, die Sie benötigen. Danach können Sie ein beliebiges Accessor-Attribut verwenden, das für die Verwendung in Ihrer PLUCK-Methode definiert ist.

solange sich alle für den Accessor benötigten Spalten im GET befinden ;-)

0
David Notrac