ホームページ  >  記事  >  バックエンド開発  >  LaravelフレームワークのSeederを利用して自動データ充填機能を実装する

LaravelフレームワークのSeederを利用して自動データ充填機能を実装する

不言
不言オリジナル
2018-06-13 09:26:501847ブラウズ

この記事では、Laravel フレームワークによる自動データ充填機能を実現するための Seeder の使用方法を主に紹介し、Seeder クラスに基づいた Laravel のデータ自動充填に関する関連操作テクニックと注意事項をサンプルの形式で分析します。以下を参照してください。

この記事の例では、Laravel フレームワークによる Seeder を使用して自動データ充填機能を実現する方法について説明します。参考までに皆さんと共有してください。詳細は次のとおりです。

Laravel は Seeder クラスを使用してデータを自動的に入力します

<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
  /**
   * Run the database seeds.
   */
  public function run()
  {
    //
  }
}
class MyTableSeeder extends Seeder
{
  public function run()
  {
    //
  }
}

カスタマイズされた Seeder には実行関数が 1 つだけあり、その中に自動実行関数を記述します。充填手順

これらの 2 つの関数がわかりますか?

Model::unguard();
//你的填充操作
Model::reguard();

私は、これら 2 つの関数が何に使われるのか非常に混乱していました。これらは次のような関数のペアであると推測することしかできません。互いに反対して働きます。そこでソースコードを確認してみました。

これら 2 つの関数は、ディレクトリ \vendor\laravel\framework\src\Illuminate\Database\Eloquent の Model.php で定義されています

/**
* Disable all mass assignable restrictions.
*
* @param bool $state
* @return void
*/
public static function unguard($state = true)
{
    static::$unguarded = $state;
}
/**
* Enable the mass assignment restrictions.
*
* @return void
*/
public static function reguard()
{
    static::$unguarded = false;
}

Laravel の作者を参照してください。コメントから、これがデータ充填制限に対する操作であることがわかります。

つまり、unguard が最初で、reguard が自動充填操作の制限を解除する責任があり、reguard が制限を復元する責任があります。

充填操作の前に、モデルのメンバー関数を使用することをお勧めします。

Model::truncate();

この関数は、モデルに対応するデータ テーブルをクリアするため、注意して使用してください。

<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
  /**
   * Run the database seeds.
   */
  public function run()
  {
    Model::unguard();
    $this->call(&#39;PostTableSeeder&#39;);
    Model::reguard();
  }
}
class PostTableSeeder extends Seeder
{
  public function run()
  {
    App\Post::truncate();
    factory(App\Post::class, 1000)->create();
  }
}

ここの読者の中には、「なぜすべての入力操作を組み込みの DatabaseSeeder の run 関数に記述しないのですか?」と疑問に思う人もいるかもしれません。

完全なシステムを開発する場合、多くのデータ テーブルに入力する必要があるため、毎回 run 関数を大量に変更する必要はありません。また、塗りつぶすたびに塗りつぶしプロセスを保持できることを望んでいます。そのため、新しいクラスを作成し、それを $this->call() 関数で呼び出すことをお勧めします。

次は工場について話しましょう。

ファイルディレクトリ\database\factories\ModelFactory.php

$factory->define(App\Post::class, function ($faker) {
  return [
    &#39;title&#39; => $faker->sentence(mt_rand(3, 10)),
    &#39;content&#39; => join("\n\n", $faker->paragraphs(mt_rand(3, 6))),
    &#39;published_at&#39; => $faker->dateTimeBetween(&#39;-1 month&#39;, &#39;+3 days&#39;),
  ];
});

それはわかるのですが、$factory変数が何かわかりません。したがって、Factory クラスをチェックして見つけてください。

ディレクトリ \vendor\laravel\framework\src\Illuminate\Database\Eloquentの Factory.php でソース コードを見つけます

/**
* Define a class with a given set of attributes.
*
* @param string $class
* @param callable $attributes
* @param string $name
* @return void
*/
public function define($class, callable $attributes, $name = &#39;default&#39;)
{
    $this->definitions[$class][$name] = $attributes;
}
/**
* Create an instance of the given model and persist it to the database.
*
* @param string $class
* @param array $attributes
* @return mixed
*/
public function create($class, array $attributes = [])
{
    return $this->of($class)->create($attributes);
}

データの入力を開始します。私たちはまだ職人コマンドライン

php artisan db:seed

を使用しています。このコマンドは、DatabaseSeeder.php に記述したすべてのクラスの run 関数を実行します。将来プロジェクトが複雑になった場合、実行する必要はありません。すでに実行されているので、コマンドラインの後にパラメータを追加します。特定のクラスの run 関数を実行するだけです。

php artisan db:seed --class=你要执行的类名称

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。

関連する推奨事項:

Laravel フレームワークのルーティングとコントローラーのバインディング操作について

Laravel のライフサイクルについてフレームワーク原理の分析

Laravel フレームワークのルーティング設定

以上がLaravelフレームワークのSeederを利用して自動データ充填機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。