2015-06-26 118 views
3

我怎樣才能播種表與來自同一個表像的消息兩個外鍵:如何種子自參照表Laravel 5.1

遷移:

public function up() 
    { 
     Schema::create('messages', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('to')->unsigned(); 
      $table->integer('from')->unsigned(); 
      $table->integer('parent_id')->unsigned()->nullable(); 
      $table->text('body'); 
      $table->boolean('status')->default(false); 
      $table->timestamps(); 
     }); 

     Schema::table('messages', function (Blueprint $table) { 
      $table->foreign('to') 
        ->references('id')->on('users') 
        ->onDelete('cascade'); 

      $table->foreign('from') 
        ->references('id')->on('users') 
        ->onDelete('cascade'); 

      $table->foreign('parent_id') 
        ->references('id')->on('messages'); 

     }); 
    } 

ModelFactory:

$factory->define(App\Message::class, function($faker) { 

    return [ 
     'body' => $faker->text 
     'from' => //user id, 
     'to' => //user id, 
     'parent_id' => //message id 
    ]; 

}); 
  1. 我該如何獲得用戶ID?
  2. 如何獲取id的現有消息行?

回答

2
$messages = factory(App\Message::class, 20)->create(); 
$messageIds = DB::table('messages')->lists('id'); // returns array of userids 
DB::table('categories')->where('id', $rowid); // where $rowid is the id which you want 

完整的解決方案會是這樣

class MessagesTableSeeder extends Seeder 
{ 
    public function run() 
    { 
     // start with some cleanup  
     DB::table('messages')->truncate(); 
     // Create some App\Message instances... 
     $messageCount = 30; 
     $messages = factory(App\Message::class, $messageCount)->create(); 
     $messageIds = DB::table('messages')->lists('id'); 
     for($i=0; $i<$messageCount - 1; $i++) { 
      $randomizedMessageIds = $messageIds; 
      shuffle($randomizedMessageIds); 
      DB::table('messages')->where('id', $i)->update(['parent_id'=>$randomizedMessageIds[$i]]); 
     } 
    } 
} 
+0

快速注意列表已在5.3中被棄用,以支持pluck,所以它變成:$ messageIds = DB :: table('messages') - > pluck('id');它返回一個集合。爲了將數組放入$ randomizedMessageIds進行混洗,我們需要:$ randomizedMessageIds = $ messageIds-> all(); – theotherdy

0

遲到了,但我有另一種解決方案:

在創建工廠什麼型號,前幾次,讓parent_id爲0.在DB中指定的創建條目之後,可以傳入已創建的實際獲取數據。

我使用它來自引用類別和子類別。

$factory->define(CMS\Models\Category::class, function (Faker\Generator $faker) { 
    $users = \CMS\Models\User::all()->pluck('user_id')->toArray(); 

    /* Get all categories, if there are less then 4, the reference 
    is an array with a 0, meaning no parent. After 4 are created, we 
    start picking random categories s a parent ID, the list will grow 
    so does the variation. Of course you can set the minimum amount 
    of created categories as you wish.*/ 

    $categories = \CMS\Models\Category::all()->pluck('category_id'); 
    if (count($categories) <= 4) { 
     $categories = [0]; 
    } else { 
     $categories = $categories->toArray(); 
    } 
    return [ 
     'category_id' => $faker->unique()->numberBetween(1,1000), 
     'title' => $faker->sentence(1,40), 
     'description' => $faker->text(50), 
     'content' => $faker->paragraph(rand(3,5)), 
     'approved' => $faker->boolean(), 
     'trashed' => $faker->boolean(), 
     'type' => $faker->randomElement('post','product'), 
     'user_id' => $faker->randomElement($users), 
     'parent_id' => $faker->randomElement($categories), 
     'created_at' => $faker->dateTimeThisYear, 
     'updated_at' => $faker->dateTimeThisYear, 
    ]; 
}); 

使用這種方法,如果你設置這是需要PARENT_ID的添加到您的數據庫的count($categories) <= 1你將有沒有父母至少1項。如果絕對需要讓所有條目都具有parent_id,則只需手動更改數據庫中的1列。