Как получить аватар пользователя, когда у меня есть только имя пользователя? - PullRequest
1 голос
/ 12 апреля 2019

Я хочу получить аватар пользователя из моей таблицы пользователей, когда у меня есть только имя пользователя из моей таблицы сообщений.

Я пытался сделать цикл по каждому элементу следующим образом:

$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);
}

Может ли кто-нибудь просветить меня и привести меня на правильный путь? Спасибо!

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Вы переопределяете переменную $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, а не только имя, и добавить отношение . Тогда код будет:

   $posts = Post::with('user')->get();

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

with('user') предварительно загружает отношение , чтобы не создавать слишком много запросов. Если вам нужен только аватар, вы можете улучшить его, используя вместо этого with('user:avatar').

Вид будет выглядеть следующим образом:

@foreach($posts as $post)
    <span>{{ $post->user->avatar }}</span>
    <span>{{ $post->post_url }}</span>
@endforeach
0 голосов
/ 12 апреля 2019

Прежде всего, этот подход вызовет проблемы с производительностью и логическими проблемами. Лучше заменить идею получения пользователя по имени по идентификатору или убедиться, что имя уникально. Однако здесь есть исправление

$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);

Я рекомендую установить связь между пользователями и публикацией на основе внешнего ключа

см .: красноречивые отношения

0 голосов
/ 12 апреля 2019

Если вы знаете, sql, вы можете отправить в базу данных что-то вроде:

    SELECT avatar FROM users WHERE username="John_15";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...