web-dev-qa-db-fra.com

Cueillir avec plusieurs colonnes?

Quand j'utilise plumer avec plusieurs colonnes j'obtiens ceci:

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

Mais j'ai besoin de ça?

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

Toute suggestion, comment puis-je faire cela? Ceci est ma méthode:

    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

Parce que c'est comme ça que cueille. Au lieu d'essayer ceci.

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

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

Vous devez utiliser select() avec get(), puis modifier ultérieurement l’objet selon vos besoins.

Donc au lieu de: ->pluck('region','district'); Utilisez: ->select('region','district')->get();

pluck() est conseillé lorsque vous avez besoin de la valeur d'une colonne seulement.

Et dans la mesure du possible, vos modèles ne seront pas au pluriel dans vos modèles (Districts) - suivez la nomenclature Laravel.

15
Learner

C’est un problème auquel je suis constamment confronté et m’a amené à créer la solution suivante qui peut être utilisée sur des modèles ou des tableaux.
Il existe également un support pour la syntaxe à points qui créera un tableau multidimensionnel selon les besoins.

Enregistrez cette macro dans la AppServiceProvider (ou tout fournisseur de votre choix):

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

Ceci peut alors être utilisé de la manière suivante:

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

Ou en plus, sur tous les modèles, vous pouvez avoir:

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

Il est également possible de référencer toute relation à l'aide de la notation par points, ainsi que de la syntaxe 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

Laravel: Pour utiliser plusieurs colonnes dans des tableaux distincts, utilisez le code suivant.

$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

Ma solution dans LARAVEL 5.6:

Bonjour, je viens d’avoir le même problème, il me fallait 2 colonnes combinées dans une liste de sélection . Ma base de données comporte 2 colonnes pour les utilisateurs: prénom et nom de famille ..__ name visible et id comme valeur . Voici comment je l'ai corrigé, en utilisant la méthode pluck ():

Dans le modèle utilisateur, j'ai créé une fonction d'accesseur de nom complet:

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

Après cela, pour remplir la liste de sélection avec le nom complet et l'identifiant de base de données correspondant, j'ai utilisé ce code dans mon contrôleur qui renvoie la vue (sans afficher les utilisateurs archivés, mais vous pouvez modifier le début de la requête si vous le souhaitez. , les plus importantes sont les fonctions get () et pluck ():

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

Maintenant, vous pouvez utiliser les utilisateurs $ de votre liste de sélection!

Donc, tout d’abord, vous obtenez toutes les valeurs de la base de données dont vous aurez besoin, puis vous pouvez utiliser n’importe quel attribut d’accesseur défini pour être utilisé dans votre méthode PLUCK,

tant que toutes les colonnes nécessaires pour l'accesseur sont dans le GET ;-)

0
David Notrac