2015-07-10 15 views
5

İki tablonun var, posts ve likes. Belirli bir user_id tarafından beğenildi tüm mesajlar alır, Eloquent kullanarak, bir sorgu oluşturmanız gerekir.Sütunun başka bir tabloda bulunduğu sorgu Sorgu

SELECT * FROM posts p LEFT JOIN likes l ON p.id = l.post_id WHERE l.user_id = 2 ORDER BY l.created_at DESC 

posts tablo:

+----+---------+------------+-------------+ 
| id | user_id | message | created_at | 
+----+---------+------------+-------------+ 
| 1 |  2 | Hello!  | <SOME TIME> | 
| 2 |  3 | World!  | <SOME TIME> | 
| 3 |  2 | Something. | <SOME TIME> | 
| 4 |  2 | Another. | <SOME TIME> | 
+----+---------+------------+-------------+ 

likes tablo:

İşte
+----+---------+---------+-------------+ 
| id | post_id | user_id | created_at | 
+----+---------+---------+-------------+ 
| 1 |  1 |  2 | <SOME TIME> | 
| 2 |  2 |  2 | <SOME TIME> | 
| 3 |  1 |  3 | <SOME TIME> | 
| 4 |  3 |  2 | <SOME TIME> | 
+----+---------+---------+-------------+ 

benim Post sınıftır:

başka deyişle

, böyle bir şey olmalı

<?php 

class Post extends Eloquent { 

    protected $table = 'posts'; 

    public function likes() 
    { 
     return $this->hasMany('Like'); 
    } 

} 

Ve Like sınıfı:

<?php 

class Like extends Eloquent { 

    protected $table = 'likes'; 


    public function post() 
    { 
     return $this->belongsTo('Post'); 
    } 

} 

Bunu nasıl yapabilirim?

+0

Neden sadece laravel ilişkilerini kullanmıyorsun? Bir kullanıcı seç <-> ilişkiyi beğendiniz mi? – rmobis

cevap

7

bu çalışması gerekir:

$user_id = //however you get the userid here. 

$posts = Post::whereHas('likes', function ($q) use($user_id){ 
    $q->where('user_id', $user_id); 
})->get(); 
+0

Bu doğru cevabı :-) –

+1

'(Bu yazımda cep telefonumda yazıyor, bu yüzden herhangi bir yazım hatası özür dilerim)', Sorun yok, sizin için düzenlenmiş, 'Mesajlar' 'Post' için varsayalım :-) :-) –

+0

Helped bana benzer bir problemle – AdRock

0
Sen, aşağıdaki sorgu laravel idam nasıl iki veya daha fazla tabloları katılır gerçekleştirmek için laravel en DB sınıfını kullanabilirsiniz

:

$users = DB::table('posts') 
     ->leftJoin('likes', 'posts.id', '=', 'likes.post_id') 
     ->select('posts.*', 'likes.*') 
     ->where('likes.user_id', '=', '2') 
     ->orderBy('likes.created_at', 'desc') 
     ->get(); 

üstünde DB sınıfını kullanmak unutmayın senin kontrol edici;

Eğer anlamlı ile yapmak istiyorsanız

, yapmanız gereken follwing:

$result = Post::whereHas('likes', function ($q) use($user_id) 
       { 
        $q->where('user_id', $user_id); 
       }) 
        ->orderBy('likes.created_at') 
        ->get(); 
+0

Sorunun söylediği gibi Eloquent'i kullanmalıyım. – user4913694

+0

Tersine ihtiyacı vardır, 'Likes' yerine' Posts'. –