Laravel получение класса на виду без перехода от контроллера - PullRequest
0 голосов
/ 14 июля 2020

У меня есть сводная таблица post_profil e, которая содержит сердечки (лайки) каждого сообщения.

Сообщение. php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $guarded = [];

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

    public function profilesHearted()
    {
        return $this->belongsToMany(Profile::class);
    }
}

Профиль. php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    protected $guarded = [];
    
    public function profileImage()
    {
        $imagePath = ($this->image) ? $this->image : 'profile/czyhBQu2YWX6gvBivZrnEs2ORoBwr3d9mzkwxk8k.png';
        return $imagePath; 
    }

    public function followers()
    {
        return $this->belongsToMany(User::class);
    }

    public function heartedPosts()
    {
        return $this->belongsToMany(Post::class);
    }

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

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

Это индексная функция PostsController.php, которая приводит к представлению:

public function index()
{
    $users = auth()->user()->following()->pluck('profiles.user_id');
    $posts = Post::whereIn('user_id', $users)->with('user')->latest()->paginate(5);
    return view('posts.index', compact('posts', 'users' ));
}

То, что я пытался сделать, но удаляется в конечном итоге после сбоя, получается каждое сообщение в foreach l oop и проверяется, каждый ли $post->heartedProfiles(contains($users)), но это не работает таким образом. Таким образом, я попробовал еще один способ, на мой взгляд ie, index.blade.php

@foreach($users as $userid)
    User::select('id')->where('profile_id', $userid)->first()
        ->profile->profilesHearted->find($post->id)
@endforeach

Что не работает, потому что класс User не может использоваться непосредственно в поле зрения без прохождения.

Я уверен, что в Laravel есть более простой и понятный способ сделать это. Я впервые использую Laravel и программирование ORM, так что я чувствовал себя потерянным. Взял учебник по клонированию FreeCodeCamp в Instagram и понял основы. Все, что мне нужно, это дать мне какую-то идею, чтобы начать работу.

1 Ответ

1 голос
/ 15 июля 2020

При работе со многими ко многим вам необходимо использовать сводные функции, поэтому вы бы так и поступили

Post::profilesHearted()->wherePivotIn('profile_id', $users)->first()

Не проверял код, но, надеюсь, это даст вам представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...