Отображается только первый результат в БД, но при вызове Model: all () метод не может быть найден - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть модель, которая имеет несколько методов

Модель друга

Это позволяет следующее

  1. Определяет, что дружба не установлена.
  2. Определяет, что запрос был отправлен
  3. Определяет наличие дружеских отношений.

Это строки.

  • FriendId (добавляется)

  • friendName

  • userId (делает добавление)
  • userName
  • request_sent логическое значение по умолчанию 0
  • допустимое логическое значение по умолчанию 0

    публичная функция addFriend ()

    {

        return $this->accepted == 0 && $this->request_sent == 0;
    }
    
    
    public function hasRequestPending()
    {
        return $this->accepted == 0 && $this->request_sent == 1;
    }
    
    public function isFriend()
    {
        return $this->accepted == 1 && $this->request_sent == 0;
    }
    

Метод hasRequestPending не существует.

У меня есть контроллер

В методе индекса $ Friend получает только данные первой строки в базе данных, но это приводит к тому, что все пользователи по всей системе видят базу данных. Если у меня есть Friend :: all (), я получаю ошибку

public function index($id){
   $user = User::where('id', $id)->first();
   $Friend= Friend::first();

   //dd($Tenancyall);
  return view('/pages/account/index', compact('user',Friend));
}

Это вид

<div class="row">
        <div class="col-md-12">

          @if(Auth::user()->id == $user->id)
            <h1>You cannot add yourself</h1>
          @elseif($Friend== null || $Friend->addFriend())
            <a href="/account/friend/{{$user->id}}/create" class="btn btn-primary">Add</a>
          @endif

          {{--  
            If the user signed in isn't the owner of this profile.
            Do not show these buttons that control accept/reject/end
          --}}

        @if(Auth::user()->id == $user->id)
          {{-- 
            If the request has been sent but hasn't been accepted.
            Give the option to accept and reject.
            This updates the values in DB.
          --}}
          @if($Friend->hasRequestPending())

            <form method="POST" action="/account/friend/{{$user->id}}/accept">
              {{ csrf_field() }}
              <input type="submit" class="btn btn-primary" value="Accept Request">
            </form>
            <form method="POST" action="/account/friend/{{$user->id}}/reject">
              {{ csrf_field() }}
              <input type="submit" class="btn btn-warning" value="Reject Request">
            </form>

          @elseif($Friend->isFriend())
            <form method="POST" action="/account/friend/{{$user->id}}/end">
              {{ csrf_field() }}
              <input type="submit" class="btn btn-primary" value="End Friendship">
            </form>
            <h5>Currently Friend with {{$Friend->friend_name}}</h5>

          @endif <!-- End of current user vs this user-->
        @endif <!-- Initial If-->
      </div>

В настоящее время, когда все первые пользователи видят первую дружбу, и если добавляется еще одна, она не отображается для пользователя, но отображается в БД. Когда первое отношение закончено / принято, оно влияет на все строки.

Вот функции в контроллере для принятия, который изменяется на 1 для каждого запроса

public function accept(Request $request, User $user){
    Friend::where('accepted', 0)->where('request_sent', 1)
            ->update(
              [
                'accepted' => 1,
                'request_sent' => 0,
              ]

            );
    return back();
  }

Есть какие-нибудь идеи на hos для решения этой проблемы?

1 Ответ

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

Ответ на ваш первый вопрос: почему я вижу первую строку в базе данных для каждого пользователя?

Если вы хотите выбрать первого друга, связанного с конкретным пользователем, я бы порекомендовал вам использовать Eloquent для определения отношений: https://laravel.com/docs/5.6/eloquent-relationships.

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

public function friends()
{
     return $this->hasMany(Friend::class, 'userId');
}

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

$user = User::findOrFail($id);
$friend= $user->friends->first();

То, что это вернет, будет первым Другом, который связан с этим конкретным Пользователем. Так что это будет уникальным для каждого пользователя.

Если вы хотите выбрать все запросы на добавление в друзья, которые привязаны к этому пользователю, вы можете использовать:

$user = User::find($id);
$friends = $user->friends;

Ответ на ваш второй вопрос: как мне решить проблему с тем, что каждый запрос принимается при использовании функции accept?

Сначала вы должны выбрать конкретный вопрос. Прямо сейчас вы обновляете все запросы одновременно из-за того факта, что where возвращает экземпляр коллекции и что вы в настоящее время не выбираете уникальный идентификатор. Если вы хотите принять конкретный запрос, я бы порекомендовал использовать следующий код:

public function accept(Request $request, User $user, $friendId){
    Friend::where('accepted', 0)
            ->where('request_sent', 1)
            ->where('userId', $user->id)
            ->where('friendId', $friendId)
            ->update(
              [
                'accepted' => 1,
                'request_sent' => 0,
              ]

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