胎嘎侯
接續昨日的主題,今天要了解的是1對多個關係(One to Many),也就是一個A實體會對應到多個B實體。待會的實例為:假定1個用戶會有多篇文章,同一張表裡的每篇文章只有1個用戶(無共同編輯)。
延續使用昨天的users資料表,只需另外創建一個新的Model與Migration即可。
php artisan make:model Post -m
進入posts資料表,添加兩個新的欄位後,進行php artisan migrate
:
$table->string('title');
$table->unsignedBigInteger('user_id');
確認欄位是否成功建立,接著我們要使用Factory快速建立幾筆假的Post資料。
php artisan make:factory PostFactory --model=Post
進入PostFactory,將下列欄位加入return之中:
這裡我們利用faker並指定要產出的假資料為sentence;另外,將所有的user資料表數據以亂數隨意指定id並存在post資料表的user_id裡。
$factory->define(Post::class, function (Faker $faker) {
return [
'title'=>$faker->sentence,
'user_id'=>User::all()->random()->id,
];
});
到Tinker執行Factory的指令(如果您不熟tinker,可以照著試試看,這裡先不進行解釋)
php artisan tinker
進入後輸入指令(9指的是要產出9筆,指向create方法)
factory(App\Post::class,9)->create();
別忘了到資料庫確認假資料的產出哦~
分解Eloquent的1對多關係
hasMany:每個用戶有數個posts
belongsTo:這些posts屬於同一個用戶
把下列資料分別輸入至User.php、Post.php
User.php
public function posts()
{
//每個用戶有數個posts
return $this->hasMany('App\Post'); //綁定與Post的關係(正向)
}
Post.php
protected $fillable = ['title','user_id'];
public function user()
{
//這些posts屬於同一個用戶
return $this->belongsTo('App\User');
}
建立一個get請求的路由,URI為/posts。
Route::get('posts',function(Request $request)
{
$posts = Post::where('user_id',3)->with('user')->get();
return $posts;
});
從Post(Model)中找user_id為3的資料,指向前面創建的user方法(這些posts屬於同一個用戶),我們來看Postman會返回什麼資料。
從資料庫來看:
從Post(Model)中找user_id為3的資料。
返回的是users 資料表的第1、7筆資料。
今天1對多就先到這啦~明天見