Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Уникальные поля и валидация » 03.06.2017 11:43:14

Я бы попробывал использовать такое правило, может сработает:

PHP
'name' => [
    
'required',
    
Rule::unique('T1','t2_id')->where(function ($query) {
        
$query->where('t3_id'$t3_id_value);
    })
]

name — имя поля на форме
$t3_id_value — сюда идет значение, которое надо проверить для поля t3_id.

PS:При использовании конструктора правил Rule, правила в валидатор передаются не строкой, а массивом.

#2 Re: Laravel 5.x » Использование транзакций с моделями Eloquent » 02.06.2017 15:44:22

Спасибо за развернутый ответ! Полезная информация, добавил в закладки.

#3 Re: Laravel 5.x » Уникальные поля и валидация » 02.06.2017 15:32:11

Если поля должны быть уникальны в связке, то получается что и валидацию надо делать одновременно по обоим полям — t2_id и t3_id.
Насколько я понял, для t2_id берется значение из поля формы «name». А откуда берется значение для t3_id?

Для валидации одного поля на уникальность с разными названиями на форме и в таблице, достаточно добавить имя поля из таблицы к правилу unique:

PHP
'name' => 'unique:T1,t2_id'

#4 Laravel 5.x » Использование транзакций с моделями Eloquent » 02.06.2017 10:40:15

Engineer
Ответов: 2

Laravel: 5.4.24
MySQL: 5.7.17 (InnoDB)

Привет всем! Посмотрел описание работы с транзакциями в документации Laravel. Там подробно расписано как действовать, взаимодействуя с БД через фасад DB, но примеров использования транзакций с  Eloquent ORM там не нашел. Указано только, что с ним тоже можно работать, используя инструменты DB фасада.
Попробывал набросать код, следуя интуиции:

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    {
        $user = null;
        try{

            DB::beginTransaction();

            // Create a user record
            $user = User::create([
                'name' => $data['reg_fname'].' '.$data['reg_lname'],
                'email' => $data['reg_email'],
                'password' => bcrypt($data['reg_password']),
            ]);

            // Add a profile to the user
            $user->profile()->save(new UserProfile([
                'fname' => $data['reg_fname'],
                'lname' => $data['reg_lname']
            ]));

            DB::commit();

        } catch(\Exception $exception){

            DB::rollBack();

            // Allow Laravel engine to handle this exception
            throw $exception;
        }

        return $user;
    }

Тут создается сначала запись в таблице users, а затем добавляется запись в таблицу user_profiles. Все происходит внутри одной транзакции.

Проверил, вроде все работает как надо. При ошибке добавления записи в user_profiles, отменяется запись в таблицу users.

Вопросы: всё ли я делаю правильно? Можно ли и дальше в проекте использовать такой подход? Нет ли каких подводных камней?

Прошу, наведите на путь истинный, ибо не ведаю что творю, добро или зло. Не хотелось бы, чтобы в конце проекта настигла кара небесная smile

Подвал раздела