2
votes

Passer une quantité ou d'autres arguments à un semoir Laravel

Je voudrais passer un argument pour définir le nombre d'enregistrements que je souhaite créer lors de l'amorçage de la base de données, sans avoir à modifier l'usine manuellement.

J'ai essayé différentes variantes de php artisan db:seed --class=UsersTableSeeder [using different args here]

Je n'arrive pas à trouver de documentation, donc je ne sais pas si cela existe fonctionnellement. Est-ce que quelque chose comme ça existe?

class UsersTableSeeder extends Seeder
{
    public $limit = null;

    public function __construct($limit = 1) {
        $this->limit = $limit;
    }

    public function run()
    {
      echo $this->limit;
    }
}


0 commentaires

4 Réponses :


2
votes

D'après ce que je sais, il n'y a pas de paramètres pour les semoirs, mais vous pouvez l'implémenter vous-même. Vous pouvez créer une nouvelle commande qui accepte les paramètres et appelle un semeur par programmation avec ces paramètres supplémentaires.

Quelque chose comme ça devrait faire l'affaire:

namespace App\Console\Commands;

use Illuminate\Console\Command;
use UsersTableSeeder;

class SeedCommand extends Command
{
    protected $signature = 'app:seed {limit}';

    public function handle(UsersTableSeeder $seeder)
    {
        $limit = $this->argument('limit');
        $seeder->run($limit);
    }
}
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{

    public function run(int $limit)
    {
        echo $limit;
        // Seed some stuff
    }
}


5 commentaires

J'étais juste en train d'écrire ceci comme commentaire, ce qui devrait probablement être. Bien que cela soit correct, cela ne répond pas tout à fait à la question. Si vous fournissez un exemple (syntaxe pour créer la commande, exemple de paramètres passés à la commande, générer une nouvelle instance du semeur et lui transmettre les arguments, puis appeler run() , etc.), alors elle y répondrait, mais cette question pourrait aussi être trop large.


Salut Tim, j'aime que nous ayons tous les deux trouvé la même réponse. Je n'ai pas le temps de mettre cela dans un exemple de code réel. N'hésitez pas à ajouter votre propre réponse avec un code. Nous pouvons donc marquer cela comme accepté


C'est juste ça, je n'ai pas vraiment le temps non plus; c'est plus de code que je ne voudrais écrire, ce qui est un motif de fermeture comme "trop large" (c'est-à-dire que les réponses exigeraient trop d'informations pour être considérées comme une réponse concise). Je suppose qu'il n'y a aucun mal à avoir ceci comme "réponse", mais cela pourrait être critiqué / signalé; dur à dire.


Vous savez quoi, je vais ajouter un exemple dans un instant;)


qu'est-ce que c'est, cela ne ressemble pas à une réponse



6
votes

Il n'y a aucun moyen de spécifier directement un argument.

Si vous souhaitez spécifier un paramètre via la ligne de commande, vous pouvez utiliser une variable d'environnement.

SEEDER_LIMIT=10 php artisan db:seed --class=UsersTableSeeder

Appelez comme ceci:

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        $limit = env('SEEDER_LIMIT', 1);

        echo $this->limit;
    }
}


4 commentaires

@TimLewis Dans ce cas, il utilise une variable d'environnement définie à partir de l'environnement shell, et non à partir du fichier .env . Même si cette valeur est définie dans le fichier .env , toutes les variables définies dans l'environnement shell sont prioritaires, vous pouvez donc remplacer les valeurs définies dans le .env . Là où vous devez faire attention, cependant, c'est lorsque vous mettez en cache votre configuration. Lorsque la configuration est mise en cache, le fichier .env n'est pas chargé. C'est pourquoi il est fortement déconseillé d'utiliser la fonction env() dehors des fichiers de configuration. Je l'ai utilisé ici pour plus de simplicité et puisque les seeders sont normalement utilisés dans les environnements de développement sans configurations mises en cache.


@TimLewis Aussi parce que la valeur par défaut est codée en dur dans le code (non définie dans le fichier .env ), et parce que toute modification de la valeur par défaut nécessiterait que la variable d'environnement soit définie dans le shell, ce que la fonction env() lire indépendamment d'une configuration mise en cache.


Oui, bien sûr, tout à fait d' accord avec tout, je ne savais pas que vous pouvez définir transitoire env (je suppose que non .env ) les variables via la ligne de commande comme ça. Cela semble assez utile pour des choses ponctuelles comme celle-ci. Vive l'information!


@TimLewis Pas de problème. Heureux d'avoir pu aider. :)



0
votes

vous pouvez demander cette limite avant d'appeler tout autre semeur en utilisant

public function run($limit)
{
   // you can access limit variable here
}

et ensuite vous pouvez passer cette limite à tous les seeders supplémentaires de 'DatabaseSeeder' comme ceci

//DatabaseSeeder.php

$this->call(AnyAdditionalSeeder::class, false, compact('limit'));

puis dans 'AnyAdditionalSeeder', vous pouvez ajouter un paramètre et le nommer $ limit à la méthode run () comme ceci

// DatabaseSeeder.php

$limit = $this->command->ask('Please enter the limit for creating something !!');

puis quand vous exécutez la commande php artisan db:seed il vous demandera la limite :)


0 commentaires

0
votes

ma solution:

static function run(int $nRec=1) {

Appel depuis un fichier .php

public function run() {

Schéma pour créer une table

        Schema::create('members', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('phone_number');
            $table->char('status',1);
            $table->timestamps();
        });

En bref: changer

// Members.php
namespace App\Http\Livewire;

use Livewire\Component;
use App\Models\Member;
use Database\Seeders\MemberSeeder;

class Members extends Component
{
    public $members, $name, $email, $phone_number, $status, $member_id;
    public $bldModal = '';
    ...
    ...
    public function generaRecords() {
        MemberSeeder::run(2);
    }
}

À

// MemberSeeder.php (example for Members Table)

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Member as ModelsMember;

class MemberSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    static function run(int $nRec=1) {
        ModelsMember::factory()->times($nRec)->create();
    }
}


0 commentaires