İlk denememde yaptım, herhangi bir sorun yok gibi. Ya ben sorunu anlamadım, ya da only vb karışık olaylara gerek yok.
Öncelikle Eloquent ile Relationship yaptığımızda join kullanmıyor ikinci bir sorgu kullanıyor.
Benim örneğimde blog iletilerini ve "Relationship" olarak iletilerin ait olduğu kategorileri "belongs_to" ile çekiyorum.
Profiler kısmını ayarlardan açıp ordan SQL sorgularına bakalım. İlk olarak yukarıda birkaç örneği var "Relationship" kısmında "select" kullandığımda * yerine select edilen verileri çekiyor. Burası tamam.
SELECT `cat_id` FROM `blog_category` WHERE `cat_id` IN ('7', '8', '9', '6')
Bir de ana sorgudan sadece istediklerimizi çekelim, bende ilk defa denedim, ilk deneme de oldu.
$posts = Blog_Post::with('category')->get(array('id', 'post_title', 'cat_id'));
SELECT `id`, `post_title`, `cat_id` FROM `blog_post`
Sonuç olarak profilerdeki bilgiler:
SELECT `id`, `post_title`, `cat_id` FROM `blog_post`
SELECT `cat_id` FROM `blog_category` WHERE `cat_id` IN ('7', '8', '9', '6')
Önemli:
Test ederken çok önemli bir şey oldu, eğer ana sorguda "cat_id" alanını çekmez isem, ikinci sorgu düzgün çalışmıyor IN('0') diyordu, bunun sebebi "cat_id" alanının "Relationship" için bağlayıcı anahtar değer olması.
Bir de model dosyamı ekleyeyim, "Recent post" fonksiyonunu özellikle silmedim, model içinde kendi metodumuzu kullanabileceğimizi göstermek için:
class Blog_Post extends Eloquent {
public static $table = 'blog_post';
public static $key = 'id';
public static $timestamps = TRUE;
// The default number of models to show per page when paginating
public static $per_page = 10;
// Relationship
public function category()
{
//return $this->belongs_to('Blog_Category', 'cat_id');
return $this->belongs_to('Blog_Category', 'cat_id')->select(array('cat_id'));
}
// Recent post
// Blog_Post::recent_post()
public static function recent_post()
{
// Cache 5 min
return Cache::get('blog_recent_post', function() {
$posts = Blog_Post::order_by('created_at', 'desc')->take(10)->get();
Cache::put('blog_recent_post', $posts, 5);
return $posts;
});
}
}