Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,036

HOME > บทความจากสมาชิก > Laravel::Eloquent ORM Part 2 มาต่อกันเรื่องการทำให้คำสั่งคิวรี่สั้นได้อีก



 
Clound SSD Virtual Server

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 นะครับ







   
Share
Bookmark.   

  By : taqman
  Article : บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ
  Score Rating :
  Create Date : 2013-05-17
  Download : No files
Sponsored Links
ThaiCreate.Com Forum


Comunity Forum Free Web Script
Jobs Freelance Free Uploads
Free Web Hosting Free Tools

สอน PHP ผ่าน Youtube ฟรี
สอน Android การเขียนโปรแกรม Android
สอน Windows Phone การเขียนโปรแกรม Windows Phone 7 และ 8
สอน iOS การเขียนโปรแกรม iPhone, iPad
สอน Java การเขียนโปรแกรม ภาษา Java
สอน Java GUI การเขียนโปรแกรม ภาษา Java GUI
สอน JSP การเขียนโปรแกรม ภาษา Java
สอน jQuery การเขียนโปรแกรม ภาษา jQuery
สอน .Net การเขียนโปรแกรม ภาษา .Net
Free Tutorial
สอน Google Maps Api
สอน Windows Service
สอน Entity Framework
สอน Android
สอน Java เขียน Java
Java GUI Swing
สอน JSP (Web App)
iOS (iPhone,iPad)
Windows Phone
Windows Azure
Windows Store
Laravel Framework
Yii PHP Framework
สอน jQuery
สอน jQuery กับ Ajax
สอน PHP OOP (Vdo)
Ajax Tutorials
SQL Tutorials
สอน SQL (Part 2)
JavaScript Tutorial
Javascript Tips
VBScript Tutorial
VBScript Validation
Microsoft Access
MySQL Tutorials
-- Stored Procedure
MariaDB Database
SQL Server Tutorial
SQL Server 2005
SQL Server 2008
SQL Server 2012
-- Stored Procedure
Oracle Database
-- Stored Procedure
SVN (Subversion)
แนวทางการทำ SEO
ปรับแต่งเว็บให้โหลดเร็ว


Hit Link
   







Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่