web-dev-qa-db-fra.com

Comment créer manuellement une nouvelle collection Eloquent vide dans Laravel 4

Comment créer une nouvelle collection Eloquent dans Laravel 4, sans utiliser Query Builder?)

Il existe une méthode newCollection() qui peut être remplacée par une tâche qui ne fait pas vraiment le travail car elle est utilisée uniquement lorsque nous interrogons un résultat défini.

Je pensais construire une collection vide, puis la remplir d'objets Eloquent. La raison pour laquelle je n'utilise pas array est parce que j'aime les méthodes de collections Eloquent telles que contains.

S'il y a d'autres alternatives, j'aimerais les entendre.

35
JofryHS

Ce n'est pas vraiment Eloquent, pour ajouter un modèle Eloquent à votre collection, vous avez quelques options:

Dans Laravel 5 vous pouvez bénéficier d'un assistant

$c = collect(new Post);

ou

$c = collect();
$c->add(new Post);

OLD Laravel 4 REPONSE

$c = new \Illuminate\Database\Eloquent\Collection;

Et alors tu peux

$c->add(new Post);

Ou vous pouvez utiliser make:

$c = Collection::make(new Post);
80

À partir de Laravel 5. J'utilise la fonction globale collect()

$collection = collect([]); // initialize an empty array [] inside to start empty collection

cette syntaxe est très propre et vous pouvez également ajouter des décalages si vous ne voulez pas l'index numérique, comme ceci:

$collection->offsetSet('foo', $foo_data); // similar to add function but with
$collection->offsetSet('bar', $bar_data); // an assigned index
10
Gokigooooks

Pour ajouter à la réponse acceptée, vous pouvez également créer un alias dans config/app.php

'aliases' => array(

    ...
    'Collection'      => Illuminate\Database\Eloquent\Collection::class,

Ensuite, vous devez simplement faire

$c = new Collection;
4
andrewtweber

En fait, j'ai constaté que l'utilisation de newCollection() était plus durable ...

Exemple:

$collection = (new Post)->newCollection();

Ainsi, si vous décidez de créer ultérieurement votre propre classe de collection pour votre modèle (comme je l’ai déjà fait plusieurs fois), il est beaucoup plus facile de refactoriser votre code, car vous remplacez simplement la fonction newCollection() dans ton modèle

3
Samuel Cloete

Laravel> = 5.5

Cela n’est peut-être pas lié à la question initiale, mais comme c’est l’un des premiers liens de la recherche google, j’ai trouvé cela utile pour ceux qui, comme moi, cherchent à créer une collection vide.

Si vous voulez créer manuellement une nouvelle collection vide , vous pouvez utiliser la méthode d'assistance collect de cette manière. :

$new_empty_collection = collect();

Vous pouvez trouver cette aide dans Illuminate\Support\helpers.php

fragment:

if (! function_exists('collect')) {
    /**
     * Create a collection from the given value.
     *
     * @param  mixed  $value
     * @return \Illuminate\Support\Collection
     */
    function collect($value = null)
    {
        return new Collection($value);
    }
}
2
chebaby

Il est préférable d’utiliser le modèle d’injection et après $this->collection->make([]) que new Collection

use Illuminate\Support\Collection;
...
// Inside of a clase.
...
public function __construct(Collection $collection){
    $this->collection = $collection;
}

public function getResults(){
...
$results = $this->collection->make([]);
...
}
1
Victor Aguilar