Laravel:如何播种Baum的嵌套集?

时间:2014-07-31 02:20:32

标签: php laravel-4

我想将我的一个表作为嵌套集播种。我正在使用Baum的嵌套集,它提供了一种查看嵌套集的简便方法:https://github.com/etrepat/baum#seeding

如何使用/database/seeds/中的Baum?根据Laravel文档,我需要扩展Seeder类以便播种工作。但是,为了使用Baum的方法,我需要扩展Baum\Node

建议?

2 个答案:

答案 0 :(得分:2)

哦,如果你可以直接使用Baum型号并且它可以用于你的目的,我建议你使用它。这样您就可以轻松访问baum的功能。我直接在种子中使用我的Baum模型,而不扩展播种器类。 这是一个小片段:

class BusinessUnitTableSeeder extends Seeder
    {
        public function run()
        {
            $admin = DB::table('user')->where('login_name', '=', 'superadmin')->pluck('id');
            $root = BusinessUnit::create([
                    'name' => 'Headquarters',
                    'created_by' => $admin,
                    'updated_by' => $admin,
                    'owned_by'   => $admin
                ]);
            $user = \User::find($admin);
            $user->business_unit = $root->id;
            $user->save();
            $child1 = $root->children()->create([
                    'name' => 'Business unit 1',
                    'created_by' => $admin,
                    'updated_by' => $admin,
                    'owned_by'   => $admin
            ]);
            $child2 = $child1->children()->create([
                    'name' => 'Business unit 2',
                    'created_by' => $admin,
                    'updated_by' => $admin,
                    'owned_by'   => $admin
            ]);


        }
    }

UPD :要了解种子放置位置以及如何调用主题,请直接参考文档here。使模型非常快。所以我建议你这样做,这将导致更少的行动进一步做。该模型必须放在models目录中,并且扩展Baum的模型的快速片段将是

class YourModel extends extends Baum\Node
{
 /**
   * Column name to store the reference to parent's node.
   *
   * @var string
   */
  protected $parentColumn = 'parent_id';

  /**
   * Column name for left index.
   *
   * @var string
   */
  protected $leftColumn = 'lft';

  /**
   * Column name for right index.
   *
   * @var string
   */
  protected $rightColumn = 'rgt';

  /**
   * Column name for depth field.
   *
   * @var string
   */
  protected $depthColumn = 'depth';

/**
         * Table name.
         *
         * @var string
         */
        protected $table = 'your_baum_table';

}

然后直接在你的种子中使用它。就这些 。 此外,我向应用添加种子的首选方法是使用迁移:

  1. 创建种子
  2. 创建迁移
  3. 功能up()中的
  4. 只需添加Artisan::call('db:seed',['--class'=> 'YourDesiredSeed'])
  5. 这样我就可以在已经运行的应用程序上添加演示或真实数据。

答案 1 :(得分:0)

  

我用于我的产品

     

我只是使用包含baum中使用的变量的数组来做。

     

我使用以下方法创建了一个模型:

     

php artisan baum:安装产品

     

这将创建一个模型(我更改为app文件夹)和迁移。   只需更新迁移文件:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProductsTable extends Migration {

  /**
   * Run the migrations.
   *
   * @return void
   */
  public function up() {
    Schema::create('products', function(Blueprint $table) {
      // These columns are needed for Baum's Nested Set implementation to work.
      // Column names may be changed, but they *must* all exist and be modified
      // in the model.
      // Take a look at the model scaffold comments for details.
      // We add indexes on parent_id, lft, rgt columns by default.
      $table->increments('id');
      $table->integer('parent_id')->nullable()->index();
      $table->integer('lft')->nullable()->index();
      $table->integer('rgt')->nullable()->index();
      $table->integer('depth')->nullable();

      // Add needed columns here (f.ex: name, slug, path, etc.)
      // $table->string('name', 255);

      $table->string('name',500);
      $table->string('slug');
      $table->string('brand',255);
      $table->string('sku',255)->unique();
      $table->string('description',1000);
      $table->integer('quantity');
      $table->decimal('price',6,2);
      $table->boolean('badge',2);
      $table->string('image1',255);
      $table->boolean('visible',2);
      $table->string('created_at');
      $table->string('updated_at');

      });
  }

  /**
   * Reverse the migrations.
   *
   * @return void
   */
  public function down() {
    Schema::drop('products');
  }

}

然后就像你的种子一样使用。

use App\Product;
use Baum\Node;
use Illuminate\Database\Seeder;

class ProductTableSeeder extends Seeder
{
   public function run()
    {
        $data = array(
            [
                'name'          => 'product1',
                'slug'          => 'slug blablabla',
                'brand'         => 'brand',
                'sku'           => 'xxxxxx',
                'description'   => 'Lorem ipsum dolor sit amet',
                'quantity'      => 100,
                'price'         => 275.00,
                'badge'         => 1,
                'image1'        => 'xxx.jpeg',
                'visible'       => 1,
                'created_at'    => new DateTime,
                'updated_at'    => new DateTime,
            ],
        );
        Product::insert($data);
    }
}