Как получить изображения, которые понравились определенному пользователю? - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь создать переменную, которая содержит последние 7 изображений, которые понравились пользователю с определенным идентификатором, чтобы я мог передать эту переменную своему представлению. Я считаю, что должен использовать whereHas(), но пока я ничего не пробовал, поэтому возможно, что я ошибаюсь.

У меня есть следующие таблицы:

Table: Votes
Columns: id, user_id, image_id, vote

Table: Users
Columns: id, username, password

Table: Images
Columns: id, name, user_id, path

В таблице голосов, если значение голоса равно 1, оно равно и 0 - неприязнь.

У меня есть модели для 3 столов, как это:

Image

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    public function user(){
        return $this->belongsTo('App\User');
    }


    public function votes(){
        return $this->hasMany('App\Vote');
    }


}

Пользователь:

<?php

namespace App;

use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;


class User extends Model implements Authenticatable
{
    use \Illuminate\Auth\Authenticatable;
    public function images(){

        return $this->hasMany('App\Image');
    }

    public function votes(){
        return $this->hasMany('App\Vote');
    }

}

Голоса:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Vote extends Model
{
    public function images(){
        return $this->belongsTo('App\Images');
    }
}

Мне удалось придумать что-то близкое к тому, что я имею в виду:

$likedImages = Image::where('parent_id', NULL)->whereHas('votes', function($q) use ($vote) {
    return $q->where('vote', $vote);
})->orderBy('created_at', 'desc')->limit(7)->get();

К сожалению, такие изображения нравятся всем, а не только конкретному пользователю.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Обычно whereHas() добьется цели, если вы хотите, чтобы изображения, за которые проголосовали, вы делаете что-то вроде

Image::whereHas('votes',function($votes) {
    //if you want to get only votes with 1 you do
    $votes->where('vote',1);
})
//if you want to get the latest 7 images you order them and take 7
->orderBy('id','DESC')
->take(7)
->get();

Это даст вам все изображения с votes строкой. Если это не удастся, возможно, ваши отношения установлены неправильно.

0 голосов
/ 04 сентября 2018

Вам необходимо использовать модель Vote и получить последние 7 голосов , где аналогичное значение равно 1 и LEFT JOIN таблице изображений.

Я не специалист ORM, но ...

Непроверенный пример:

$votes = Vote::where([
        ["user_id", "=", $userId],
        ["vote", "=", 1]])->leftJoin("images", "user_id", "=", "images.user_id")->latest()->take(7);

Опять же, это не проверено, но я дал вам идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...