|
Laravel::Eloquent ORM Part 2 มาต่อกันเรื่องการทำให้คำสั่งคิวรี่สั้นได้อีก |
Laravel::Eloquent ORM Part 2 มาต่อกันเรื่องการทำให้คำสั่งคิวรี่สั้นได้อีก บทความนี้จะมาต่อเมื่อวานนะครับ บทนี้จะยาวได้อีกนะครับ
Inserting Related Models(การเพิ่มข้อมูลแบบเพิ่มคีย์เชื่อมไปด้วย)
สมมุติเรามีตาราง Comments ที่เชื่อมกับ Post แล้วเราต้องการเพิ่ม Comments ของ Post ที่ 1 เราก็ทำตามตัวอย่างข้างล่างนี้ได้เลยครับ
Code (PHP)
$comment = new Comment(array('message' => 'A new comment.'));
$post = Post::find(1);
$comment = $post->comments()->insert($comment);
เมื่อเพิ่มข้อมูลดังตัวอย่างคอลัมน์ที่เราตั้งให้เป็นคีย์เชื่อมก็จะได้รับการตั้งค่าไปด้วย กรณีนี้ คอลัมน์ post_id ก็จะถูกเพิ่มค่าเป็น1.
ถ้าเป็นความสัมพันแบบ 1 ต่อ กลุ่ม ก็ตามตัวอย่างเลย สามารถเพิ่มได้มากขึ้น
Code (PHP)
$comments = array(
array('message' => 'A new comment.'),
array('message' => 'A second comment.'),
);
$post = Post::find(1);
$post->comments()->save($comments);
Inserting Related Models (Many-To-Many)(การเพิ่มข้อมูลแบบกลุ่มต่อกลุ่ม)
เป็นตัวอย่างเดียวกับการค้นหาแบบกลุ่มต่อกลุ่มก่อนหน้านี้นะครับ แต่ครั้งนี้เราจะเพิ่มข้อมูลลงไปแทน
Code (PHP)
$role = new Role(array('title' => 'Admin'));
$user = User::find(1);
$role = $user->roles()->insert($role);
ตัวอย่างข้างบนคือเราเพิ่ม role คือสิทธิระดับ admin ให้กับ user ที่มี id = 1 ไม่เพียงแต่สองตารางจะมีค่าแล้วตาราง user_role ก็จะถูกเพิ่มเข้าไปด้วย บางครั้งเราอยากเพิ่มข้อมูลให้ตารางกลางอย่างเดียวทำได้ตามตัวอย่างเลยครับ :
Code (PHP)
$user->roles()->attach($role_id);
กรณีที่อยากใส่แบบเจาะจง ก็ใส่ค่าลงไปเป็นพารามิเตอร์ที่สองเลยครับ
Code (PHP)
$user->roles()->attach($role_id, array('expires' => $expires));
ฟังก์ชัน sync ใช้ในการแก้ไขตารางกลางครับ
Code (PHP)
$user->roles()->sync(array(1, 2, 3));
Working With Intermediate Tables(การจัดการข้อมูลในตารางกลางนะครับ)
กรณีที่เราต้อวงการใช้ข้อมูลจากตารางกลางในการค้นหาข้อมูลนะครับ ตัวอย่างนี้คือเราต้องการค้นหาว่า User ที่มี id =1 มีสิทธิ์ทำอะไรได้บ้าง
Code (PHP)
$user = User::find(1);
$pivot = $user->roles()->pivot();[/code]
Pivot คือ model ของตารางกลางนะครับ ตัวอย่างข้างล่างนี้ค้นไปวนลูปโชว์ไปเลยครับ:
[code] foreach ($user->roles()->pivot()->get() as $row)
{
//
}
เข้าถึงในระดับคอลัมน์ก็ได้เลย:
Code (PHP)
$user = User::find(1);
foreach ($user->roles as $role)
{
echo $role->pivot->created_at;
}
เหมือนการค้นหาทั่วไป นะครับเมื่อเราเชื่อมตารางเข้าด้วยกันแล้ว การค้นหาก็จะได้ข้อมูลที่เชื่อมต่อกันมาเป็นพรวนเลย
ถ้าเราต้องการยกเลิกสิทธิ์ของ user ที่มี id = 1 ก็ตามตัวอย่างเลยครับ:
Code (PHP)
$user = User::find(1);
$user->roles()->delete();
ความเจ๋งของมันคือตอนแรกเพื่อนเห็น ตัวอย่างนี้ก็คิดเลยว่ามันต้องไปลบที่ตาราง role ใช่ไหมหละครับ แต่มันไปลบตรงตารางกลางอย่างเดียวเลย .
Eager Loading(การจัดการๆคิวรี่แบบลูกโซ่) Eager loding คือการจัดการๆปัญหาการคิวรี้แบบลูกโซ่ ตัวอย่างข้างล่าง หนังสือมีผู้แต่งได้หลายคน:
Code (PHP)
class Book extends Eloquent {
public function author()
{
return $this->belongs_to('Author');
}
}
Now, examine the following code:
foreach (Book::all() as $book)
{
echo $book->author->name;
}
เมื่อทำการคิวรี่ก็จะมีการคิวรี่เกิดขึ้นหลายครั้งเพราะหนังสือแต่ละเล่มก็จะไปค้นหา ผู้แต่งของมันด้วย ซึ่งจะทำให้ช้ามาก
แต่ Laravel ก็เตรียมฟังก์ชัน with ไว้ให้แล้วครับ
Code (PHP)
foreach (Book::with('author')->get() as $book)
{
echo $book->author->name;
}
ถ้าเราใช้ฟังก์ชัน with จะมีการคิวรี่แค่สองครั้งตามข้างล่างนี้เลยครับ
Code (PHP)
SELECT * FROM "books"
SELECT * FROM "authors" WHERE "id" IN (1, 2, 3, 4, 5, …)
ถ้ามีหลายความสัมพันธ์ก็จับยัดลงไปให้หมดได้เลยครับ:
Code (PHP)
$books = Book::with(array('author', 'publisher'))->get();
ใส่ความสัมพันธ์ที่ซับซ้อนลงไปแบบง่ายๆเลยครับ:
Code (PHP)
$books = Book::with(array('author', 'author.contacts'))->get();
ตัวแปร include คือการประกาศว่าโมเดลนั้นใช้ eager loading ทั้งหมดเลย
Code (PHP)
class Book extends Eloquent {
public $includes = array('author');
public function author()
{
return $this->belongs_to('Author');
}
}
ทีนี้เราก์ไม่ต้องใส่ with ละ.
Code (PHP)
foreach (Book::all() as $book)
{
echo $book->author->name;
}
Constraining Eager Loads บางครั้งเราต้องการกำหนดเงื่อนไขไปด้วยก็สามารถทำได้เหมือนในตัวอย่างเลยครับ:
Code (PHP)
$users = User::with(array('posts' => function($query)
{
$query->where('title', 'like', '%first%');
}))->get();
Getter & Setter Methodssetter method ให้เราสามารถรับค่าฝากค่าได้ง่ายๆเลยเพียงใส่ prefix "set_" นำหน้าชื่อตัวแปร
Code (PHP)
public function set_password($password)
{
$this->set_attribute('hashed_password', Hash::make($password));
}
การฝาค่าแบบไม่ใช้ setter.
Code (PHP)
$this->password = "my new password";
Getters ก็เหมือนกัน ที่ให้เราใส่ prefix "get_" นำหน้า ตัวแปร
Code (PHP)
public function get_published_date()
{
return date('M j, Y', $this->get_attribute('published_at'));
}
จะเหมือนกับข้างล่างนี้คือการอ้างอิงค่าเท่านั้น ไม่ได้เรียกใช้ตัวแปรตรงๆ .
Code (PHP)
echo $this->published_date;
Mass-assignment คือการเพิ่มค่าจำนวนหลายคอลัมแต่ไม่ทุกอัน ปกติเราจะทำแบบนี้
Code (PHP)
$user = new User(array(
'username' => 'first last',
'password' => 'disgaea'
));
$user->save();
หรือว่าจะใช้ ฟังก์ชัน fill เหมือนตัวอย่างข้างล่างนี่ก็ได้นะครับ
Code (PHP)
$user = new User;
$user->fill(array(
'username' => 'first last',
'password' => 'disgaea'
));
$user->save();
โดยค่าเริ่มต้นแล้ว key กับ value ของ สองตัวอย่างข้างบนจะถูกจับคู่กับคลัมน์ในฐานข้อมูล
เราสามารถอนุญาตให้เข้าถึงได้โดยประกาศตัวแปร $accessible
Code (PHP)
public static $accessible = array('email', 'password', 'name');
หรือจะทำในโมเดลก็ได้นะครับ:
Code (PHP)
User::accessible(array('email', 'password', 'name'));
Converting Models To Array(การแปลงค่าที่ดึงจากฐานข้อมูลเป็นอาเรย์)
หลายๆครั้งเราต้องการดึงค่าขึ้นมาแล้วแปลงเป็น json เพื่อนส่งค่ากลับคืนไปบนบราวเซอร์ ถ้าเป็นโค้ดปกติก็ยาวหน่อยนะครับแต่ใน Laravel แค่นี้เองครับ
Code (PHP)
return json_encode($user->to_array());
to_array method จะจัดค่าให้คอลัมเป็นคีย์เองเลยครับ การดึงค่าแบบนี้ก็ติดการค้นหาแบบลูกโซ่ด้วยนะครับ
เราไม่ต้องการให้คอลัมน์ password ถูกคิวรี้ขึ้นไปแสดงด้วยก็ประกาศตัวแปร hidden เลยครับl:
Code (PHP)
class User extends Eloquent {
public static $hidden = array('password');
}
Deleting Models(การลบโมเดล) จะลบโมเดลก็ง่ายๆเลยครับ แต่ลบแบบนี้จะไม่ลบโมเดลที่เชื่อมไว้นะครับ
$author->delete();
เยอะไหมหละครับ ต้องลองเอาไปใช้เองนะครับถึงจะจำได้ ผมยังจำได้ไม่หมดเลย คราวหน้าจะมาต่อเรื่อง Bundle นะครับ
|
|
|
|
|
|
|
|
By : |
taqman
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
|
|
Create Date : |
2013-05-17 |
|
Download : |
No files |
|
Sponsored Links |
|
|
|
|
|
|