2016-12-06 3 views
0

Я хочу создать отношения, которые проверяют, понравился ли пользователь сообщение. Чтобы сделать это, отношения должны проверить, зарегистрирован ли пользователь, а затем использовать их user_id, чтобы получить подобную запись. Что-то вроде:Состояние отношений, если пользователь вошел в систему

public function userLike() { 
    if (Auth::check()) return $this->hasOne('App\Like')->where('user_id', Auth::user()->id); 
} 

Однако это не работает. Кроме того, если пользователь не вошел в систему и эта связь вызвана (по умолчанию она), она вернет ошибку.

Каков правильный способ сделать это?

+0

Вашего отношению должны не проверяйте, зарегистрирован ли пользователь, вы определяете отношения для пользователя и, следовательно, он будет загружен, если есть зарегистрированный пользователь. в вашем маршруте или контроллерах, которые вы можете сделать, если (\ Auth :: check()), чтобы увидеть, есть ли зарегистрированный пользователь –

+0

, проблема с кодом выше: 'Auth :: check()' возвращает 'false',' ' Функция userLike() 'ничего не возвращала. поэтому, если вы вызываете 'User :: userLike()' или тому подобное, он возвращает null в код laravel, который имеет дело с отношением. так что лучше обернуть вещи на стороне контроллера вместо модели. –

ответ

0

Это, как я хотел бы сделать что:

1) «любит» стол

Я бы сначала создать таблицу для хранения всех «любит» с колоннами для «post_id» и «user_id»

2) создать связи

пользователя Модель

public function likes() 
{ 
    return $this->belongsToMany('App\Post', 'likes', 'user_id', 'post_id'); 
} 

Сообщение Модель

public function likes() 
{ 
    return $this->belongsToMany('App\User', 'likes'); 
} 

3) Сообщение Контроллер - метод

Я бы сделать следующее:

  • проверить, если пользователь вошел в систему , в противном случае выдаст ошибку
  • убедитесь, что пост существует, в противном случае выдаст ошибку
  • создать новую запись в как таблицы с user_id и post_id

(вы также можете проверить, если пользователь вошел в систему непосредственно на маршруте с использованием промежуточного программного)

4) В представлении

Я хотел бы вызвать метод контроллера с использованием Ajax вызова.

Не уверен, что я что-то забыл, но надеюсь, что это может вам помочь.

Если вам нужно «понравиться» больше вещей, чем только сообщение, проверьте полиморфные отношения.

1

Если вы хотите условно загрузить отношение, то вы можете сделать это ленивой нетерпеливой загрузкой.В вашем примере вы могли бы определить отношение как

public function userLike() { 
    return $this->hasOne('App\Like', 'user_id'); 
} 

Затем в контроллере (или где-либо еще) вы можете сделать чек, если пользователь вопрос в настоящее время вошли в систему пользователя или не

$loggedInUser = auth()->user(); 
if($loggedInUser){ 
    $loggedInUser->load('userLike'); 
} 

Затем вы можете продолжить все, что хотите, с помощью loggedInUser и .

Скажет, у вас есть несколько пользователей в точке (в коде), и вы хотите загрузить люблю для только текущего пользователя, то вы можете

//$users is a collection of multiple users - assumed 
foreach($users as $user){ 
    if($user->email === auth()->user()->email){ 
     $user->load('userLike'); 
    } 
} 

Надеется, что это помогает