|
Laravel::Eloquent ORM Part 1 ทำการให้คำสั่งคิวรี่สั้นได้อีก |
Laravel::Eloquent ORM Part 1 ทำการให้คำสั่งคิวรี่สั้นได้อีก ต่อจากคราวก่อนครั้งนี้เราจะนำคำสั่งคราวก่อนมาใช้ใน Model แล้วทำให้สั้นได้อีก จะทำยังไงมาตลอดตามเลยครับ
Eloquent ORM
คือ Orm ของ laravel ครับแต่ถูกออกแบบมาให้สั้นกว่าเข้าใจได้ง่ายกว่าครับ อย่างข้างล่างใน framework อื่นเราสืบทอดมาจาก model ใน laravel เราสืบทอดจาก eloquent ครับ
Code (PHP)
class User extends Eloquent {}
โครงสร้าง
• ทุกตารางจะมี primary key คือ id
• ทุกตารางจะใช้ชื่อ Model ตรงๆเลย เพื่อความกระชับและเข้าใจง่าย
ถ้าเราอยากใช้ชื่ออื่นเป็นชื่อตาราง หรือคอลัมอื่นเป็น primary key ก็แค่ประกาศครับ
Code (PHP)
class User extends Eloquent {
public static $table = 'my_users';
public static $key = 'my_primary_key';
}
Retrieving Models(การค้นหาข้อมูล)
อย่างที่บอกไว้บอกตอนท้ายบทก่อนว่าเราจะย่อให้สั้นอีก บทก่อนเราใช้ DB :: (‘User)-> บททนี้เราย่อให้ชื่อตารางแทนเลย
Code (PHP)
$user = User::find(1);
echo $user->email;
ข้างล่างคือ sql ที่ออกมาครับ
Code (PHP)
SELECT * FROM "users" WHERE "id" = 1
ถ้าจะค้นแบบ * ครับ
Code (PHP)
$users = User::all();
foreach ($users as $user)
{
echo $user->email;
}
ฟังชันอะไรที่ใช้ในบทก่อน เราก็ใช้ได้ในบทนี้ครับ
Code (PHP)
$user = User::where('email', '=', $email)->first();
$user = User::where_email($email)->first();
$users = User::where_in('id', array(1, 2, 3))->or_where('email', '=', $email)->get();
$users = User::order_by('votes', 'desc')->take(10)->get();
Aggregates เหมือนบทก่อนเลยครับแต่ย่อได้อีก
Code (PHP)
$min = User::min('id');
$max = User::max('id');
$avg = User::avg('id');
$sum = User::sum('id');
$count = User::count();
$count = User::where('id', '>', 10)->count();
Inserting & Updating Models(เพิ่มและแก้ไข)
การ insert ก็แค่สร้าง object ใหม่แล้วเรียกใช้แต่ละคอลัมในตารางนั้น แล้วก็เรียกฟังก์ชัน save ครับ
Code (PHP)
$user = new User;
$user->email = '[email protected]';
$user->password = 'secret';
$user->save();
ใช้ create ในการสร้าง column ใหม่ครับ
Code (PHP)
$user = User::create(array('email' => '[email protected]'));
จะแก้ไขก็ง่ายๆ ครับ หาข้อมูลแถวที่เราจะแก้ไขแล้วก็แทรกข้อมูลที่เราจะแก้ไขลงไปก็เสร็จแล้ว
Code (PHP)
$user = User::find(1);
$user->email = '[email protected]';
$user->password = 'new_secret';
$user->save();
เราอยากจะบันทึกเวลาการสร้างหรือแก้ไขข้อมูลลงไปด้วย ง่ายๆเลยครับ ด้วยการใช้ฟังก์ชันข้างล่าง
Code (PHP)
class User extends Eloquent {
public static $timestamps = true;
}
เราต้องสร้างคอลัมน์ชื่อ created_at กับ updated_at ไว้ด้วยนะครับ laravel จะบันทึกข้อมูลเวลาลงในคอลัมทั้งสองโดยอัตโนมัติ
บางครั้งเราอยากจะแก้ไขคอลัม updated_at ในตอนที่เราไม่ได้แก้ไขข้อมูล อาจจะเป็นเรียกขึ้นมาดูเฉยก็ใช้ ฟังก์ชัน touch เลยครับ
Code (PHP)
$comment = Comment::find(1);
$comment->touch();
หรือจะใช้ฟังก์ชัน timestamp แทนก็ได้ครับ
Code (PHP)
$comment = Comment::find(1);
$comment->timestamp();
//do something else here, but not modifying the $comment model data
$comment->save();
Relationships(การเชื่อมตาราง)
การเชื่อมตารางของ laravel มี 4 รูปแบบ ครับ
has_one = แบบ 1 ต่อ 1 belongs_to = แบบกลุ่มต่อ 1
has_many = แบบ 1 ต่อ กลุ่ม has_many_and_belongs_to = แบบกลุ่มต่อกลุ่ม
1 ต่อ 1
จากตัวอย่าง ผู้ใช้งานหนึ่งคนมีโทรศัพท์หนึ่งเครื่อง
Code (PHP)
class User extends Eloquent {
public function phone()
{
return $this->has_one('Phone');
}
}
เวลาจะใช้งานก็เป็นแบบนี้เลยครับ
Code (PHP)
$phone = User::find(1)->phone()->first();
จากข้างบนถ้าจะเขียนเป็น Sql ธรรมดาก็จะเป็นแบบนี้ครับ
Code (PHP)
SELECT * FROM "users" WHERE "id" = 1
SELECT * FROM "phones" WHERE "user_id" = 1
ปกติ Eloquent จะตรวจว่าคอลัมไหนเป็นคีย์เชื่อมจาก “ชื่อคอลัมน์_id” ถ้าคีย์เชื่อมของเราไม่เป็นรูปแบบตามนั้นก็สามารถเปลียนโดยเพิ่ม พารามิเตอร์ตัวที่สองไปเหมือนตัวอย่างข้างล่างครับ
Code (PHP)
return $this->has_one('Phone', 'my_foreign_key');
เหมือนกับ framework ตัวอื่นนะครับการดึงข้อมูลก็จะเป็นแบบลูกโซ่ ที่จะไปดึงตัวที่ตารางนั้นไปเชิ่อมมาด้วย
Code (PHP)
$phone = User::find(1)->phone;
ถ้าเราเอาคีย์เชิ่อมไปวางไว้ที่ตารางไหน ตารางที่เอาไปวางไว้นั้นก็ต้องวาง belongs_to ไว้ เพื่อบอกว่า phone สังกัดอยู่กับ user
Code (PHP)
class Phone extends Eloquent {
public function user()
{
return $this->belongs_to('User');
}
}
เมื่อเชื่อมกันแล้วจะค้นหาข้อมูลที่เกี่ยวข้องกันก็ง่ายหละครับ
Code (PHP)
echo Phone::find(1)->user()->first()->email;
echo Phone::find(1)->user->email;
1-ต่อ-กลุ่ม
ยกตัวอย่าง 1 บทความมีหลายความคิดเห็น กรณีนี้เราก็ต้องใช้ has_many หละครับ:
Code (PHP)
class Post extends Eloquent {
public function comments()
{
return $this->has_many('Comment');
}
}
เวลาเราจะค้นก็เหมือนข้างล่างเลยครับ
Code (PHP)
$comments = Post::find(1)->comments()->get();
$comments = Post::find(1)->comments;
ตัวอย่างแรกจะเป็นการค้น posts ต่อมาเป็นการค้น comments
Code (PHP)
SELECT * FROM "posts" WHERE "id" = 1
SELECT * FROM "comments" WHERE "post_id" = 1
เราย่อคำสั่ง sql ยาวให้เข้าใจง่ายภายในบรรทัดเดียวได้เลย:
Code (PHP)
echo Post::find(1)->comments()->order_by('votes', 'desc')->take(10)->get();
กลุ่ม-ต่อ-กลุ่ม
ความสัมพันธ์แบบกลุ่มต่อกลุ่ม มักจะมีความยุ่งยากมาก หลาย framework ก็ยังจัดการได้ไม่ค่อยดี. For example, ยกตัวอย่าง ผู้ใช้งานมีได้หลายสิทธิ์,แต่ละสิทธ์ก็มีได้ในผู้ใช้หลายคน.ตารางสามอันนี้ทำให้เกิดความงงขึ้นได้บ่อยเลยครับ : ตารางผู้ใช้งาน, ตารางสิทธิ์, ตารางบอกว่าใครทำอะไรได้บ้าง. โครงสร้างจะเป็นแบบตัวอย่าง
Code (PHP)
// users:
id - INTEGER
email - VARCHAR
// roles:
id - INTEGER
name - VARCHAR
// role_user:
id - INTEGER
user_id - INTEGER
role_id - INTEGER
ใน laravel จะใช้ has_many_and_belongs_to สั้นๆ เลยครับ
Code (PHP)
class User extends Eloquent {
public function roles()
{
return $this->has_many_and_belongs_to('Role');
}
}
เวลาจะค้นก็แบบนี้เลยครับง่ายมาก ข้างล่างเราจะค้นว่า user นี้ มี role อะไรบ้าง
Code (PHP)
$roles = User::find(1)->roles()->get();
เวลาจะค้นว่ามีผู้ใช้กี่คนที่มีสิทธิ์นี้ก็ตามข้างล่างเลยครับ
Code (PHP)
$roles = User::find(1)->roles;
ถ้าคีย์ที่ใช้เชื่อมไม่เหมือนกับที่ laravel เราก็แค่ส่งพารามิเตอร์ไปบอกด้วย
Code (PHP)
class User extends Eloquent {
public function roles()
{
return $this->has_many_and_belongs_to('Role', 'user_roles');
}
}
โดยค่าเริ่มต้น ตารางที่ใช้เชื่อมจะส่งแค่ค่า id
Code (PHP)
class User extends Eloquent {
public function roles()
{
return $this->has_many_and_belongs_to('Role', 'user_roles')->with('column');
}
}
มีต่ออีกนะครับมันยาวมาเขียนไม่หมด
|
|
|
|
|
|
|
|
By : |
taqman
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
|
|
Create Date : |
2013-05-16 |
|
Download : |
No files |
|
Sponsored Links |
|
|
|
|
|
|