Laravel firstOrCreate с расширенными функциями

#laravel #eloquent

#laravel #красноречивый

Вопрос:

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

 UsersInvited::firstOrCreate([
                            'invited_by_id'=>$eventDetails->user_id,
                            function($query) use ($thisEmail,$thisPhone){
                                return $query->where('email',$thisEmail)->orWhere('phone',$thisPhone);
                            }
                        ]);
  

Если user_id = 3 является приглашающим участником события, а некоторые участники не зарегистрированы на портале, их необходимо сохранить в одной таблице, чтобы в будущем, если приглашенный пользователь установит приложение, я должен автоматически сделать его участником события.

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

Итак, в приведенном выше случае я хочу проверить, что thisisemail = abc@gmail.com приглашен user_id = 3 или thisPhone= 8945454545 приглашен тем же приглашающим, тогда нет необходимости делать запись.

Возможно ли это в laravel — eloquent firstOrCreate ()?

Ответ №1:

Использование кода для получения метода firstOrCreate():

 public function firstOrCreate(array $attributes, array $values = [])
  

Следовательно: вы не можете добавлять дополнительные параметры запроса к этому методу.

В вашем случае вы должны попытаться найти соответствующую запись самостоятельно. Если он не существует, вы можете его создать. Например:

 $attributes = ['invited_by_id' => '..'];

$instance = Model::where($attributes)->where(..)->orWhere(..)->first();

if( is_null ( $instance ) ) {
  $instance = Model::create($attributes);
}
  

Удачи!

Комментарии:

1. firstOrCreate() на самом деле это метод построения, поэтому вы можете вызвать firstOrCreate() вместо first() и удалить is_null() проверку.