2015-07-10 7 views
5

Mam dwie tabele, posts i likes. Potrzebuję utworzyć zapytanie, przy użyciu Eloquent, które pobiera wszystkie posty, które zostały polubione przez konkretną user_id.Zapytanie, gdzie kolumna znajduje się w innej tabeli

Innymi słowy, powinno być coś takiego:

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 tabela:

+----+---------+------------+-------------+ 
| 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 tabela:

+----+---------+---------+-------------+ 
| 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> | 
+----+---------+---------+-------------+ 

Oto moja Post klasa:

<?php 

class Post extends Eloquent { 

    protected $table = 'posts'; 

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

} 

I klasa Like:

<?php 

class Like extends Eloquent { 

    protected $table = 'likes'; 


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

} 

Jak mogę to zrobić?

+0

Dlaczego nie można po prostu użyć relacji laravel? Ustawić związek między użytkownikami lubiącymi? – rmobis

Odpowiedz

7

to powinno działać:

$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

To jest odpowiednia odpowiedź :-) –

+1

'(Piszę to na mojej komórce w pociągu, więc przepraszam za literówki)', Nie ma problemu, zredagowano dla ciebie, 'Posty' powinno być' Posta' :-) –

+0

Pomógł mnie z podobnym problemem – AdRock

0

Można użyć klasy DB laravel do wykonywania przyłącza na dwóch lub więcej tabel, po to jak zapytanie zostanie wykonane w laravel:

$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(); 

Nie zapomnij użyć klasy DB na szczycie listy kontroler;

Jeśli chcesz zrobić to z wymownym, należy wykonać follwing:

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

Potrzebuję tego, używając Wymowy, jak mówi to pytanie. – user4913694

+0

Potrzebuje odwrotności, 'Postów' zamiast' Likes'. –