ความสัมพันธ์แบบ หนึ่งต่อหนึ่ง เช่น ผู้ใช้หนึ่งคนมีโทรศัพท์หนึ่งเครื่อง เป็นต้น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * Get the phone record associated with the user. */ public function phone() { return $this->hasOne('App\Phone'); } } |
หากจะเข้าถึงข้อมูล Phone ผ่าน Model User
1 2 3 |
$phone = User::find(1)->phone; echo $phone->phonenumber; |
หรือ
1 2 3 |
$user = User::find(1); echo $user->phone->phonenumber; |
ก็จะได้ข้อมูลเหมือนกัน
* User::find(1) คือการค้นหาข้อมูลจาก Primary Key ตาม ตัวอย่างนี้คือ ค้นหา id ของตาราง users ที่มีค่าเท่ากับ 1 (ดูเพิ่มเติม)
การกำหนด foreign key ใน laravel จะกำหนดโดยใช้ “ชื่อตารางหลัก(ไม่มี s) _id” อัตโนมัติ ในกรณีตาราง phones Foreign Key ก็จะเป็น “user_id”
แต่ถ้าอยากจะกำหนดเป็นชื่ออื่นก็ให้ใช้
1 |
return $this->hasOne('App\Phone', 'foreign_key'); |
หากตาราง users Primary Key ไม่ได้กำหนดชื่อเป็น id อาจจะกำหนดเป็นชื่ออื่น เราก็ต้องเชื่อมความสัมพันธ์ระหว่าง Primary Key และ Foreign Key เอง
1 |
return $this->hasOne('App\Phone', 'foreign_key', 'local_key'); |
หากต้องการเชื่อมความสัมพันธ์กับตาราง users ก็ให้ใช้ belongsTo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Phone extends Model { /** * Get the user that owns the phone. */ public function user() { return $this->belongsTo('App\User'); } } |
ในการณี้ foreign key ไม่ใช่ user_id
1 2 3 4 5 6 7 |
/** * Get the user that owns the phone. */ public function user() { return $this->belongsTo('App\User', 'foreign_key'); } |
ในการณี้ตาราง users Primary Key ไม่ใช่ id
1 2 3 4 5 6 7 |
/** * Get the user that owns the phone. */ public function user() { return $this->belongsTo('App\User', 'foreign_key', 'other_key'); } |
เช่น หาก user (record) โดนลบไป ใน model Post เวลาเรียกใช้งาน User ก็ให้ return ค่าเป็นค่าว่าง
1 2 3 4 5 6 7 |
/** * Get the author of the post. */ public function user() { return $this->belongsTo('App\User')->withDefault(); } |
หรือหากจะ return ค่า Default เป็น attributes ก็ตามตัวอย่างด้านล่าง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/** * Get the author of the post. */ public function user() { return $this->belongsTo('App\User')->withDefault([ 'name' => 'Guest Author', ]); } /** * Get the author of the post. */ public function user() { return $this->belongsTo('App\User')->withDefault(function ($user) { $user->name = 'Guest Author'; }); } |
ความสัมพันธ์แบบ หนึ่งต่อกลุ่ม เช่น บทความหนึ่งบทความมีหลายความคิดเห็น เป็นต้น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * Get the comments for the blog post. */ public function comments() { return $this->hasMany('App\Comment'); } } |
การเข้าถึง Comment
1 2 3 4 5 |
$comments = App\Post::find(1)->comments; foreach ($comments as $comment) { // } |
สามารถฟิวเตอร์ ด้วยเงื่อนไขเข้าไปอีกได้ เช่น ดึงมาเฉพาะ comment ที่มี title ตามต้องการ
1 |
$comments = App\Post::find(1)->comments()->where('title', 'foo')->first(); |
ก็ให้ใช้ belongsTo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Comment extends Model { /** * Get the post that owns the comment. */ public function post() { return $this->belongsTo('App\Post'); } } |
ความสัมพันธ์แบบ กลุ่มต่อกลุ่ม เช่น ผู้ใช้งานมีได้หลายสิทธิ์,แต่ละสิทธ์ก็มีได้ในผู้ใช้หลายคน เป็นต้น
ทำให้มีตารางสามตาราง ตารางผู้ใช้งาน, ตารางสิทธิ์, ตารางตารางบอกว่าใครทำอะไรได้บ้าง โครงสร้างจะเป็นแบบตัวอย่าง
1 2 3 4 5 6 7 8 9 10 |
// users: id - INTEGER email - VARCHAR // roles: id - INTEGER name - VARCHAR // role_user: id - INTEGER user_id - INTEGER role_id - INTEGER |
ใน Model User
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The roles that belong to the user. */ public function roles() { return $this->belongsToMany('App\Role'); } } |
เข้าถึง role ผ่าน user
1 2 3 4 5 |
$user = App\User::find(1); foreach ($user->roles as $role) { // } |
1 |
$roles = App\User::find(1)->roles()->orderBy('name')->get(); |
ปกติตารางที่ใช้เชื่อมระหว่าง model user และ model role ก็จะเป็น role_user (Eloquent will join the two related model names in alphabetical order) หากไม่ใช่ก็สามารถระบุได้
1 |
return $this->belongsToMany('App\Role', 'role_user'); |
key เชื่อมก็สามารถกำหนดได้เช่นกัน
1 |
return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Role extends Model { /** * The users that belong to the role. */ public function users() { return $this->belongsToMany('App\User'); } } |
ดูเพิ่มเติม
https://laravel.com/docs/5.4/eloquent-relationships#defining-relationships
http://www.thaicreate.com/community/laravel-eloquent-orm-model.html
http://www.qsbg.org/BGOaudit/file/1.pdf
ป้ายกำกับ:laravel