【问题标题】:How to get a users avatar when I only have the name of the user?当我只有用户名时如何获取用户头像?
【发布时间】:2019-09-03 10:12:05
【问题描述】:

当我的帖子表中只有用户名时,我想从用户表中获取用户头像。

我尝试过这样的 foreach 循环:

$posts = Post:all();

foreach($posts as $post) {
  $user = User::where('name', $post->creator)->get();
}

return view('welcome')->with('posts', $posts)->with('user', $user);

然后像这样在我的视图中循环它:

@foreach($posts as $post)
 @foreach($user as $creator)
<span>{{ $creator->avatar }}</span>
<span>{{ $post->post_url }}</span>
 @endforeach
@endforeach

但它返回给我的是相同的头像,而不是属于该帖子的用户的头像。

我的用户模型:

    protected $fillable = [
        'name', 'email', 'password', 'avatar', 'full_name', 'slug'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function posts() {
        return $this->hasMany(Post::class, 'creator','name');
    }

后模型:

protected $fillable = [
        'creator', 'post_url', 'game', 'likes', 'created_at'
    ];

    public function user() {
        return $this->belongsTo(User::class);
    }

我的 web.php:

Route::get('/', 'PostController@main_page');

我的函数main_page:

public function main_page()
{
   $posts = Post:all();

   foreach($posts as $post) {
     $user = User::where('name', $post->creator)->get();
   }

   return view('welcome')->with('posts', $posts)->with('user', $user);
}

有人可以启发我并带我走上正确的道路吗?谢谢!

【问题讨论】:

    标签: laravel


    【解决方案1】:

    如果你知道 sql,你可以向数据库发送如下内容:

        SELECT avatar FROM users WHERE username="John_15";
    

    【讨论】:

    • 我是走错了路还是没有做 User::where('name', $post->creator)->get();相同?除了它返回一个对象而且不仅是头像,而且如果我没记错的话它是一样的?
    • 返回的对象是否包含头像字段?
    【解决方案2】:

    您为每个帖子覆盖 $user 变量。将其保存在数组中:

       $posts = Post::all();
       $users = [];
    
       foreach($posts as $post) {
         $users[$post->id] = User::where('name', $post->creator)->get();
       }
    
       return view('welcome')->with('posts', $posts)->with('users', $users);
    

    然后在视图中:

    @foreach($posts as $post)
        <span>{{ $users[$post->id]->avatar }}</span>
        <span>{{ $post->post_url }}</span>
    @endforeach
    

    但更好的解决方案是将用户的id 保存在posts 表中,而不仅仅是名称和add a relationship。那么代码将是:

       $posts = Post::with('user')->get();
    
       return view('welcome')->with('posts', $posts);
    

    with('user')preloads the relationship,不要生成太多查询。如果您只需要头像,则可以改用with('user:avatar') 使其性能更好。

    然后视图将如下所示:

    @foreach($posts as $post)
        <span>{{ $post->user->avatar }}</span>
        <span>{{ $post->post_url }}</span>
    @endforeach
    

    【讨论】:

    • 感谢您的详细回答。我对 laravel 很陌生,并试图向我的用户模型添加这样的关系: public function avatar() { return $this->belongsTo('name', 'avatar');但我收到一个名为 Call to undefined method Illuminate\Database\Eloquent\Builder::all() 的错误,我在做什么错?
    • 乐于助人。您需要在 Post 类上建立 user() 关系。您可以使用the example from the docs 并将Post 替换为User 并将Comment 替换为Post
    • 或者您可以在更新后的问题中按名称进行操作。 :-) 但您还需要在 Post 模型上定义 inverse relationship
    • 谢谢!我已经在我的 Post 模型上建立了一个 user() 关系,它返回 return $this->belongsTo(User::class);这是正确的吗?
    • 对我来说看起来是正确的。请注意,如果没有具有已定义名称的用户(例如,如果用户更改了它),这将引发错误。为防止这种情况发生,您可以使用optional($post-&gt;user)-&gt;avatar(如果找不到用户,将不打印任何内容)或定义与 ID 的关系。
    【解决方案3】:

    首先,这种方法会导致性能和逻辑问题.. 最好用 id 代替通过用户名获取用户的想法或确保名称是唯一的.. 但是这里是解决方法

    $posts = Post:all();
    $user = []; // should be an array because you're looping over it.
    foreach($posts as $post) {
      $user[] = User::where('name', $post->creator)->get();
    }
    
    return view('welcome')->with('posts', $posts)->with('user', $user);
    
    

    我建议基于外键在用户和帖子之间建立关系

    见:eloquent-relationships

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2019-10-31
      • 2019-07-01
      • 1970-01-01
      • 2016-11-21
      相关资源
      最近更新 更多