【问题标题】:Laravel need to get username of each commentLaravel 需要获取每个评论的用户名
【发布时间】:2017-12-12 13:00:37
【问题描述】:

我获取评论者的问题是我在它 cmets 时保存了用户 ID,并返回帖子下方的所有 cmets,但是当我也尝试返回用户名时,Laravel 给出了一个错误,我猜是因为它不知道应该从 users 表中返回哪个用户 ID。目前cmets的控制器如下:

$comments = DB::select("Select * from comments where article_id = $articleID");

我得到$articleID 的路径,以从数据库中查找文章内容,并在 cmets 表中使用它来查找属于的 cmets到具体的文章。但是当我尝试例如

$commenter = User::where('id', $comments->user_id)->first();

它失败了。我尝试了几个版本的这种类型的 SQL 命令,但都不起作用。因为它不知道我在说哪个评论者(我猜)。你知道我该怎么做吗?

【问题讨论】:

  • 我认为您需要做的第一件事是在您的DB::select() 上致电get()。所以它会是$comments = DB::select("Select * from comments where article_id = $articleID")->get(); 然后我想你会收到一个集合,而不是一个 cmets 对象,所以你需要迭代调用$commenter = User::find($comments->user_id)->get();的数组@
  • 哦,是的,我知道。我刚刚为 smaple 编写了该代码。我尝试了 laravel 和 mysql 的一堆东西。感觉就像控制器在选择合适的用户时感到困惑

标签: php mysql laravel controller laravel-5.4


【解决方案1】:

您必须为此使用 foreach。如果您需要每个评论都有用户,您应该遍历 cmets 来实现这一点。例如:

$comments = DB::select("Select * from comments where article_id = $articleID");

foreach ($comments as $comment) {
    $commenter = User::where('id', $comment->user_id)->first();
}

如果要获取文章中所有拥有cmets的用户,应尽量搜索用户并使用已建立的关系。 主要思想是这样的。

在用户模型中,您必须设置与 cmets 的关系:

public function comments()
{
    $this->hasMany(Comment::class);
}

然后,您可以使用whereHas 使用这些关系进行搜索:

$users = User::whereHas('comments', function ($q1) use ($articleId) {
    $q1->where('article_id', $articleId);
})->get();

这样,您将获得对本文发表评论的所有用户的列表。

【讨论】:

  • 我可以用这个回复所有评论者吗?感觉这会失败,但我会尝试
  • 我已经添加了有关此的其他信息...请看一下。
  • 很高兴为您提供帮助!
  • 这个问题是,当我尝试打开没有 cmets 的 Post 页面时,它会给出错误 Undefined variable: commenter现在我知道我必须检查是否有任何 cmets 在视图中,然后显示 cmets,我这样做了。 $commenter->username 也包含在 if 语句中,但是它仍然给出错误。我也尝试检查 $commenter insdie 控制器,但似乎不起作用
  • 好的,我做了类似`$commenter = "null"; if (count($cmets) > 0) { foreach ($cmets as $comment) { $commenter = Userprofile::where('id', $comment->user_id)->first(); } }`,它的工作原理。
【解决方案2】:

忘记所有这些东西并按照以下步骤操作:

1) 在您的评论模型中添加用户关系:

function user(){
    return $this->belongsTo('App\Models\User','user_id','id');
}

2) 然后得到你的 cmets 如下:

$comments = Comments::where('artical_id',$articleID)->with('user')->get();

3) 然后你会在每个 cmets 对象中获取用户对象。

【讨论】:

  • 我从来没有完全理解 laravel 中的模型东西
  • 我试图将函数添加到 cmets 中,但 $this 带有下划线,它说 函数名称必须是可调用的
  • 视图中到底要写什么?当然{{$comment->username}} 不会立即从用户表中返回用户名,对吗?
  • @Nikonah 这应该可以工作{{$comment->user->username}}
  • @MKhalidJunaid 我现在看到了。这是一个很好的做法。稍后我会尝试用我现在的替换它。感谢您的帮助:)
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 2019-10-01
  • 2018-08-16
  • 1970-01-01
  • 2020-01-31
  • 2018-03-28
  • 2018-01-15
  • 1970-01-01
相关资源
最近更新 更多