Как я могу получить отправленные отзывы пользователей, написанные другими пользователями? - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблема с тем, чтобы все отзывы, представленные другими пользователями, отображались в профиле соответствующего пользователя (рассматриваемого пользователя).

Есть две таблицы. Сначала таблица users с id, name, email, photo, phone и title. И у меня есть таблица avis, в которой хранятся отзывы с id, profile_id, user_id и comment. (user_id получает идентификатор User, отправляющего форму, а profile_id получает id User, получающего отзыв).

Я пытался сделать это следующим образом и не знаю, правильный ли это подход. И я не уверен, правильно ли я сделал отношения. Я новичок в Laravel. Но в любом случае это то, что я пробовал до сих пор:

Это User модель:

public function avis()
{
    return $this->hasMany('App\Avis', 'profile_id', 'user_id');
}

А это моя Avis модель:

protected $fillable = ['comment','profile_id'];

public function user() 
{
    return $this->belongsTo('App\User');
}

Это то, что я сделал в контроллере, отображающем профиль и список отзывов:

public function Details($id)
{
    $detail = User::with(['area.town', 'services'])->find($id);

    $avis = User::whereHas('avis', function ($query) use ($id) {
            $query->where('profile_id', '=', $id);
        })
        ->limit(3)
        ->get();

    //dd($avis);

    return view('Users', compact('avis', 'detail'));
}

Вот моя форма, которая используется для написания отзыва:

<div id="avisForm"> 
    <p class="feedback_message">We are here to make sure you are sastified and your transactions are safe. We do appreciate and will respond quickly to any feedback from you.</p>

    {!! Form::open(['route' => 'avis.store']) !!}

    <input type="hidden" name="profile_id" value="{{ $detail>id }}">
    {!! Form::textarea('comment', null, ['placeholder' => 'Message', 'required' => 'required']) !!}
    {!! Form::submit('Envoyez', ['class' => 'formBtn','style' => 'margin-top:10px']) !!}

    {!! Form::close() !!}
</div>

И это метод контроллера, используемый для хранения отзыва:

public function store(AvisCreateRequest $request)
{
    $avis = new Avis;
    $id = Auth::user()->id;

    $avis->comment = $request->comment;
    $avis->profile_id = $request->profile_id;
    $avis->user_id = $id;

    //dd($avis);

    $avis->save();

    return back()->with('success_message', 'Votre Avis a ete envoyez avec succes!');
}

Может кто-нибудь указать мне, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

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

public function receivedAvis()
{
    return $this->hasMany('App\Avis', 'profile_id', 'id');
}

public function writtenAvis()
{
    return $this->hasMany('App\Avis', 'user_id', 'id');
}

Затем вы можете запросить полученные отзывы следующим образом:

public function Details($id)
{
    $user = User::with(['area.town', 'services'])->find($id);

    $avis = $user->receivedAvis()
        ->limit(3)
        ->get();

    return view('Users', compact('avis', 'user'));
}

Если вы хотите, вы также можете использовать загрузку отношений на User - тогда вам не нужно передавать несколько переменных в ваше представление. Это будет выглядеть примерно так:

public function Details($id)
{
    $user = User::with(['area.town', 'services'])->find($id);

    $user ->load(['receivedAvis' => function ($query) {
        $query->limit(3);
    }]);

    return view('Users', compact('user'));
}

После этого вы можете получить доступ к своим отзывам в представлении через переменную $user:

@if(count($user->receivedAvis) > 0)
    <div id="testimonials">
        @foreach($user->receivedAvis as $avis)
            <!-- place the code to display your testimonials here -->
        @endforeach
    </div>
@endif

Обратите внимание, что я переименовал вашу $detail переменную в $user, потому что лучше использовать имена переменных, которые отражают тип переменной.

0 голосов
/ 27 апреля 2018
public function avis()
{
    return $this->hasMany('App\Avis', 'profile_id', 'id');
}

Эй, чувак, должно быть так, что 'profile_id' и 'user_id' оба являются внешними ключами. 'id' - это ваш локальный ключ в таблице пользователей, если вы вызовете avis (), он будет соответствовать id таблицы пользователей с таблицей avis profile_id

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