#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()
(особенно там, где веб-сервер может находиться за каким-либо прокси, например, балансировщиком нагрузки).