Laravel: проверьте, существует ли строка одного запроса

#php #sql #laravel

#php #sql #laravel

Вопрос:

У меня есть комментарии к статьям, которые могут иметь реакции, которые анонимно предоставляются на основе IP.

таблица реакций:

id | comment_id | ip | type

Приложение Комментарий:

 class Comment extends Model
{
    public function article() {
        return $this->belongsTo('AppArticle');
    }

    public function reactions() {
        return $this->hasMany('AppReaction')
                ->selectRaw('*, COUNT(type) as count')
                ->groupBy('type')
                ->orderBy('count', 'desc');
    }
}
  

ArticleController@index:

 public function index()
{
    $articles = Article::orderBy('views', 'desc')->get();

    return view('wiki')->withArticles($articles);
}
  

Как мне получить реакцию, заданную текущим IP-адресом пользователя (если он есть) в одном Article::orderBy запросе выше? т.е.,

Reaction::where(['comment_id' => $id, 'ip' => $_SERVER['REMOTE_ADDR']])->count();

Это можно проверить в цикле для каждого комментария, но это явно неэффективно…

Он должен быть доступен следующим образом:

 @foreach ($articles as $article)
    @foreach ($comments as $comment)
        @if ($comment->given_reaction [or something])
            // ...
        @endif
    @endforeach
@endforeach
  

Ответ №1:

Вы пробовали что-то подобное:

 $ip = $_SERVER['REMOTE_ADDR'];

$articles = Article::with(['comments' => function($q) use ($ip) {
    $q->with('reactions' => function($q) use ($ip) {
         $q->where('ip' => $ip)
    })
}])->orderBy('views', 'desc')->get();
  

Комментарии:

1. IIRC, безопаснее использовать Laravel / Symfony Request::ip() (особенно там, где веб-сервер может находиться за каким-либо прокси, например, балансировщиком нагрузки).