Laravel Insert Seed, если данные еще не существуют - PullRequest
0 голосов
/ 19 июня 2019

Есть ли способ запустить laravel seed, чтобы вставить записи, только если они еще не существуют?

Моя текущая сеялка laravel выглядит следующим образом

DB::table('users')->insert([
                //Global Admin
                [
                    'member_id' => 11111111,
                    'firstname' => 'Joe',
                    'lastname' => 'Bloggs'
                ], 
                [
                    'member_id' => 22222222,
                    'firstname' => 'Jim',
                    'lastname' => 'Bloggs'
                ], 

            ]);

Довольно стандартный!

Должен ли я обернуть каждую вставку в попытку?как это

try {
   DB::table('users')->insert(['member_id' => 11111111, 'firstname' => 'Joe', 'lastname' => 'Bloggs']);
} catch(Exception $e){
  //Die silently
}
try {
   DB::table('users')->insert(['member_id' => 22222222, 'firstname' => 'Jim', 'lastname' => 'Bloggs']);
} catch(Exception $e){
  //Die silently
}

Позже я мог бы захотеть добавить дополнительные строки в тот же сеялки без необходимости писать новую, и повторно запустить php artisan db:seed, чтобы добавить только мои новые строки.

Возможно ли это?

Ответы [ 5 ]

2 голосов
/ 19 июня 2019
В любом случае

Заполнение должно использоваться только для тестирования.

Почему бы вам просто не выполнить php artisan migrate:fresh --seed?

Это обновит вашу базу данных (удалит таблицы), а затем выполнитвсе ваши миграции снова и, наконец, снова заполняет базу данных.

Вы никогда не должны использовать сеялки в производстве.

Просто добавьте новые данные в вашу сеялку, запустите migrate:fresh и заново запустите:)

1 голос
/ 19 июня 2019

Этого можно добиться с помощью Eloquent firstOrCreate .

Метод firstOrCreate попытается найти запись базы данных, используя заданные пары столбец / значение.Если модель не может быть найдена в базе данных, будет вставлена ​​запись с атрибутами из первого параметра, а также с атрибутами в необязательном втором параметре.

Итак, если вы идентифицируете пользователя поmember_id, вы можете сделать что-то вроде этого:

    User::firstOrCreate(
        ['member_id' => 11111111],
        [
            'firstname' => 'anakin',
            'lastname' => 'skywalker',
            'password' => Hash::make('4nak1n')
        ]
    );

Если вы хотите найти запись по полям 'member_id', 'firstname' и 'lastname', что-то вроде этого:

    User::firstOrCreate(
        [
            'member_id' => 11111111,
            'firstname' => 'anakin',
            'lastname' => 'skywalker'
        ],
        [
            'password' => Hash::make('4nak1n'),
        ]
    );
1 голос
/ 19 июня 2019

Как указано stokoe0990 , запускать сеялки в производство не рекомендуется. Сеялка Laravel была написана как способ создания тестовых данных. Согласно документации " Laravel включает в себя простой метод заполнения базы данных тестовыми данными с использованием классов заполнения ".

Тем не менее, единственный способ удовлетворить ваш вопрос - встроить логику в свое семя:

$users = array(
    ['member_id' => 11111111,'firstname' => 'Joe','lastname' => 'Bloggs'], 
    ['member_id' => 22222222,'firstname' => 'Jim','lastname' => 'Bloggs']
);

foreach ($users as $user) {
  if (\App\User::find($user['id'])) {
    DB::table('users')->insert($user);
  }
}
0 голосов
/ 19 июня 2019

Лучшее, что я рекомендую, - это обрезать (или удалить все) данные в таблице при каждом переносе.Попробуйте что-то вроде этого:

//data in the table
DB::table('users')->delete(); //or use model like this: User::truncate();

DB::table('users')->insert([
                //Global Admin
                [
                    'member_id' => 11111111,
                    'firstname' => 'Joe',
                    'lastname' => 'Bloggs'
                ], 
                [
                    'member_id' => 22222222,
                    'firstname' => 'Jim',
                    'lastname' => 'Bloggs'
                ], 
            ]);

Тогда не будет дубликатов при запуске php artisan db:seed

0 голосов
/ 19 июня 2019

Этого можно добиться, используя метод Eloquent updateOrInsert():

DB::table('users')->updateOrInsert('your_data');

Подробнее об этом здесь .

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