Verification: a143cc29221c9be0

Php artisan migrate create table

Php artisan migrate create table

Предварительные требования

Для работы с этим руководством сделайте следующее:

  1. установите Git;
  2. PHP 5.6.4 или более поздней версии;
  3. Composer;
  4. Включите следующие расширения PHP, необходимые для Laravel: OpenSSL, PDO-MySQL, Mbstring, Tokenizer и XML.
  5. MySQL (этот компонент потребуется запустить).

Подготовка локальной базы данных MySQL

На этом шаге вы создадите базу данных на локальном сервере MySQL для использования в этом руководстве.

Подключение к локальному серверу MySQL

В окне терминала подключитесь к локальному серверу MySQL. Используйте это окно терминала для выполнения всех команд в рамках этого руководства.

mysql -u root -p

Если появится предложение ввести пароль, введите пароль для учетной записи root. Если вы не помните пароль учетной записи привилегированного пользователя, ознакомьтесь с разделом MySQL: How to Reset the Root Password (MySQL: как сбросить пароль привилегированного пользователя).

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

Локальное создание базы данных

В командной строке mysql создайте базу данных.

CREATE DATABASE sampledb;

Завершите подключение к серверу, введя команду quit.

quit

Локальное создание приложения PHP

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

Клонирования репозитория

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

git clone https://github.com/Azure-Samples/laravel-tasks

С помощью команды cd перейдите в клонированный каталог. Установите необходимые пакеты.

cd laravel-tasks
composer install

Настройка подключения к MySQL

В корне репозитория создайте файл .env. Скопируйте в файл .env приведенные ниже переменные. Замените заполнитель паролем привилегированного пользователя MySQL.

APP_ENV=local
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=

Сведения о том, как Laravel использует файл .env, см. в разделе Environment Configuration (Конфигурация среды).

Локальный запуск примера

Выполните перенос базы данных Laravel, чтобы создать таблицы, необходимые для приложения. Чтобы узнать, какие таблицы создаются при переносе, просмотрите каталог database/migrations в этом репозитории Git.

php artisan migrate

Создайте ключ приложения Laravel.

php artisan key:generate

Запустите приложение.

php artisan serve

Откройте браузер и перейдите по адресу http://localhost:8000. Добавьте несколько задач на странице.

Приложение PHP успешно подключается к базе данных MySQL

Чтобы остановить приложение PHP, введите Ctrl + C в окне терминала.

Создание гибкого сервера MySQL (предварительная версия).

На этом шаге вы создадите базу данных MySQL в режиме развертывания База данных Azure для MySQL (Гибкий сервер), который предоставляется в общедоступной предварительной версии. Позже вы настроите приложение PHP для подключения к этой базе данных. Запустите Azure Cloud Shell и создайте сервер, выполнив команду az flexible-server create.

az mysql flexible-server create  --resource-group myResourceGroup --public-access 

Важно!

  • Запишите значения имени сервера и строки подключения, чтобы применить их на следующем шаге для подключения к Laravel и запуска переноса данных.
  • Для аргумента IP-Address укажите IP-адрес клиентского компьютера. Созданный сервер сразу блокируется, и для локального управления этим сервером необходимо разрешить доступ клиентскому компьютеру.

Настройка брандмауэра сервера для подключения веб-приложения к серверу

В Cloud Shell создайте правило брандмауэра для сервера MySQL, чтобы разрешить подключения клиентов, выполнив команду az mysql server firewall-rule create. Если для начального и конечного IP-адресов задано значение 0.0.0.0, брандмауэр открывается только для тех служб Azure, которые не используют статические IP-адреса для подключения к серверу.

az mysql flexible-server firewall-rule create --name allanyAzureIPs --server  --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

Локальное подключение к серверу рабочей базы данных MySQL

В окне терминала на локальном компьютере подключитесь к серверу MySQL в Azure. Используйте значение, указанное ранее для и . При появлении запроса на ввод пароля используйте пароль, указанный во время создания базы данных в Azure.

mysql -u  -h .mysql.database.azure.com -P 3306 -p

Создание рабочей базы данных

В командной строке mysql создайте базу данных.

CREATE DATABASE sampledb;

Создание пользователя с разрешениями

Создайте пользователя базы данных с именем phpappuser и предоставьте ему все привилегии в базе данных sampledb. Для простоты в этом руководстве используется пароль MySQLAzure2020.

CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2020';
GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';

Завершите подключение к серверу, введя команду quit.

quit

Подключение приложения к гибкому серверу MySQL

На этом шаге вы подключите приложение PHP к базе данных MySQL, созданной в Базе данных Azure для MySQL.

Настройка подключения к базе данных

В корневой папке репозитория создайте файл .env.production и скопируйте в него следующие переменные. Замените заполнитель в значениях DB_HOST и DB_USERNAME.

APP_ENV=production
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=.mysql.database.azure.com
DB_DATABASE=sampledb
DB_USERNAME=phpappuser
DB_PASSWORD=MySQLAzure2017
MYSQL_SSL=true

Сохраните изменения.

Совет

Чтобы защитить сведения о подключении к MySQL, этот файл извлекается из репозитория Git (см. файл .gitignore в корне репозитория). Позже вы узнаете, как настроить переменные среды в службе приложений для подключения к базе данных в Базе данных Azure для MySQL. Благодаря этим переменным вам не нужен файл .env в службе приложений.

Настройка TLS/SSL-сертификата

По умолчанию гибкий сервер MySQL требует, чтобы клиенты использовали подключения по протоколу TLS. Чтобы подключиться к базе данных MySQL в Azure, вам потребуется сертификат с расширением PEM, предоставленный службой "База данных Azure для MySQL (Гибкий сервер)". Скачайте этот сертификат и поместите его в папку SSL в локальной копии репозитория с примером приложения.

Откройте файл config/database.php и добавьте в connections.mysql параметры sslmode и options, как показано в следующем коде.

'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/DigiCertGlobalRootCA.crt.pem',
    ] : []
],

Локальное тестирование приложения

Выполните перенос базы данных Laravel с помощью файла .env.production, указав его как файл среды, чтобы создать таблицы в базе данных MySQL, размещенной в Базе данных Azure для MySQL. Помните, что файл .env.production содержит сведения о подключении к базе данных MySQL в Azure.

php artisan migrate --env=production --force

Файл .env.production еще не содержит действительный ключ приложения. Создайте для него новый ключ в окне терминала.

php artisan key:generate --env=production --force

Запустите пример приложения, указав файл .env.production как файл среды.

php artisan serve --env=production

Перейдите на страницу http://localhost:8000. Если страница загрузилась без ошибок, значит, приложение PHP подключается к базе данных MySQL в Azure.

Добавьте несколько задач на странице.

Подключение приложения PHP к Базе данных Azure для MySQL

Чтобы остановить приложение PHP, введите Ctrl + C в окне терминала.

Фиксация изменений

Чтобы зафиксировать изменения, выполните следующие команды Git:

git add .
git commit -m "database.php updates"

Ваше приложение готово к развертыванию.

Развертывание в Azure

На этом шаге вы развернете приложение PHP, подключенное к базе данных MySQL, в службе приложений Azure.

Настойка пользователя развертывания

Для развертывания в веб-приложение Azure из FTP и локального репозитория Git можно использовать пользователя развертывания. Настроив один раз пользователя развертывания, вы сможете использовать его для всех последующих развертываний в Azure. Имя пользователя и пароль учетной записи развертывания отличаются от учетных данных подписки Azure.

Чтобы настроить пользователя развертывания, выполните в Azure Cloud Shell команду az webapp deployment user set. Вместо и укажите имя пользователя и пароль для вашего развертывания.

Имя пользователя должно быть уникальным в Azure. Кроме того, чтобы отправка в локальный репозиторий Git работала, имя пользователя не должно содержать символ @. Пароль должен содержать не менее восьми символов и включать два из трех следующих элементов: буквы, цифры и символы.

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux

В выходных данных JSON пароль отображается как NULL. Если вы видите сообщение "Conflict. Сведения. Ошибка 409", измените имя пользователя. Если вы видите сообщение об ошибке "Bad Request. Сведения. Ошибка 400", используйте более надежный пароль. Запишите имя пользователя и пароль и используйте их для развертывания веб-приложений.

Создание плана службы приложений

В Cloud Shell создайте план службы приложений в группе ресурсов, выполнив команду az appservice plan create. В следующем примере создается план Службы приложений с именем myAppServicePlan в ценовой категории "Бесплатный" (--sku F1) в контейнере Linux (--is-linux).

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux

Создание веб-приложения

Создайте веб-приложение в плане Службы приложений myAppServicePlan.

В Cloud Shell для этого можно использовать команду az webapp create. В следующем примере замените глобальным уникальным именем приложения (допустимые символы: a-z, 0-9 и -). Для среды выполнения установлено значение PHP|7.0. Чтобы просмотреть все поддерживаемые среды выполнения, выполните команду az webapp list-runtimes --linux.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name  --runtime "PHP|7.3" --deployment-local-git

Когда веб-приложение будет создано, в Azure CLI отобразится примерно следующее:

Local git is configured with url of 'https://@.scm.azurewebsites.net/.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": ".azurewebsites.net",
  "deploymentLocalGitUrl": "https://@.scm.azurewebsites.net/.git",
  "enabled": true,
  
}

Вы создали пустое веб-приложение с включенным развертыванием Git.

Примечание

URL-адрес удаленного репозитория Git отображается в свойстве deploymentLocalGitUrl в таком формате: https://@.scm.azurewebsites.net/.git. Сохраните этот URL-адрес для дальнейшего использования.

Настройка параметров базы данных

В службе приложений переменные среды задаются в качестве параметров приложения с помощью команды az webapp config appsettings set.

Команда ниже позволяет настроить параметры приложения DB_HOST, DB_DATABASE, DB_USERNAME и DB_PASSWORD. Замените заполнители и .

az webapp config appsettings set --name  --resource-group myResourceGroup --settings DB_HOST=".mysql.database.azure.com" DB_DATABASE="sampledb" DB_USERNAME="phpappuser" DB_PASSWORD="MySQLAzure2017" MYSQL_SSL="true"

Для доступа к параметрам можно использовать метод PHP getenv. В коде Laravel используется программа-оболочка env для PHP getenv. Например, конфигурация MySQL в файле config/database.php выглядит следующим образом:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    ...
],

Настройка переменных среды Laravel

В среде Laravel требуется ключ приложения из службы приложений. Его можно настроить с помощью параметров приложения.

В окне терминала на локальном компьютере используйте php artisan для создания ключа приложения без сохранения в файле .env.

php artisan key:generate --show

В Cloud Shell задайте ключ приложения в приложении Службы приложений с помощью команды az webapp config appsettings set. Замените заполнители и .

az webapp config appsettings set --name  --resource-group myResourceGroup --settings APP_KEY="" APP_DEBUG="true"

Значение APP_DEBUG="true" указывает Laravel возвращать отладочную информацию в случае ошибок в работе развернутого приложения. При выполнении рабочего приложения задайте для него более безопасное значение false.

Задание пути виртуального приложения

Жизненный цикл приложения Laravel начинается в общем каталоге, а не в корневом каталоге приложения. Образ PHP Docker по умолчанию для службы приложений использует Apache и не позволяет настраивать DocumentRoot для Laravel. Тем не менее вы можете использовать .htaccess для повторного создания всех запросов к точке в каталоге /public вместо корневого каталога. В корне репозитория для этой цели уже добавлен .htaccess. С ним приложение Laravel будет готово к развертыванию.

См. подробнее об изменении корневого каталога сайта.

Публикация в Azure из Git

Вернитесь к окну терминала (в локальном расположении) и добавьте удаленное приложение Azure в локальный репозиторий Git. Замените URL-адресом удаленного репозитория Git, который вы сохранили при создании веб-приложения.

git remote add azure 

Отправьте код в удаленное приложение Azure, чтобы развернуть приложение. При появлении запроса на ввод учетных данных в диспетчере учетных данных Git введите учетные данные, созданные на шаге настройки пользователя развертывания (а не те, которые используются для входа на портал Azure).

git push azure main

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

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...

Переход к приложению Azure

Перейдите по адресу http://.azurewebsites.net и добавьте несколько задач в список.

Веб-приложение PHP в Azure

Вы запустили управляемое данными приложение PHP в службе приложений Azure.

Локальное обновление и повторное развертывание модели

На этом шаге вы внесете некоторые изменения в модель данных task и веб-приложение, а затем опубликуете обновления в Azure.

Для сценария с задачами необходимо изменить приложение, чтобы можно было пометить задачу как выполненную.

Добавление столбца

В окне терминала на локальном компьютере перейдите к корневой папке репозитория Git.

Создайте перенос базы данных для таблицы tasks:

php artisan make:migration add_complete_column --table=tasks

Эта команда отображает имя файла переноса, который создается. Найдите этот файл в каталоге database/migrations и откройте его.

Замените метод up следующим кодом:

public function up()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->boolean('complete')->default(False);
    });
}

Предыдущий код добавляет столбец логических значений complete в таблицу tasks.

Замените метод down следующим кодом действия отката:

public function down()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->dropColumn('complete');
    });
}

В окне терминала на локальном компьютере выполните перенос базы данных Laravel, чтобы внести изменения в локальную базу данных.

php artisan migrate

В соответствии с условиями соглашения об именовании Laravel модель Task (см. app/Task.php) сопоставляется с таблицей tasks по умолчанию.

Обновление логики приложения

Откройте файл routes/web.php. В нем приложение определяет свои маршруты и бизнес-логику.

В конце файла добавьте маршрут с помощью следующего кода.

/**
 * Toggle Task completeness
 */
Route::post('/task/{id}', function ($id) {
    error_log('INFO: post /task/'.$id);
    $task = Task::findOrFail($id);

    $task->complete = !$task->complete;
    $task->save();

    return redirect('/');
});

Предыдущий код выполняет простое обновление модели данных, переключая значение complete.

Обновление представления

Откройте файл resources/views/tasks.blade.php. Найдите открывающий тег и замените его приведенным ниже значением.


Предыдущий код изменяет цвет строк в зависимости от того, завершена ли задача.

Следующая строка содержит приведенный ниже код.

{{ $task->name }}

Замените всю эту строку следующим кодом.


    
{{ csrf_field() }} {{ $task->name }}

Предыдущий код добавляет кнопку "Submit" (Отправить), которая ссылается на маршрут, определенный ранее.

Локальная проверка изменений

В окне терминала на локальном компьютере запустите сервер разработки из корневого каталога репозитория Git.

php artisan serve

Чтобы увидеть, как изменится состояние задачи, перейдите по адресу http://localhost:8000 и установите флажок.

Добавлен флажок для задачи

Чтобы остановить приложение PHP, введите Ctrl + C в окне терминала.

Публикация изменений в Azure

В окне терминала на локальном компьютере выполните перенос базы данных Laravel со строкой подключения рабочей базы данных, чтобы внести изменения в базу данных в Azure.

php artisan migrate --env=production --force

Зафиксируйте все изменения в Git, а затем отправьте изменения кода в Azure.

git add .
git commit -m "added complete checkbox"
git push azure main

После выполнения команды git push перейдите в приложение Azure и проверьте новые функции.

Изменения модели и базы данных, опубликованные в Azure

Добавленные задачи сохраняются в базе данных. Изменения в схеме данных не влияют на имеющиеся данные.

Очистка ресурсов

На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов, выполнив следующую команду в Cloud Shell:

az group delete --name myResourceGroup

Создание миграции

Прежде всего нам нужно сделать миграцию чтобы создать таблицу items и иметь возможность хранить наши данные

id();
            $table->json('furni');
            $table->string('type');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('items');
    }
}

Как вы уже заметили, мы отметили столбец furni как json.

А вы знали?

При создании миграции с помощью команды artisan make:migration вам не нужно указывать имя миграции с каким либо форматированием, достаточно только сделать это следующим образом:

php artisan make:migration "create items table"

Получение данных

Чтобы получить данные с сайта Habbo, мы создадим крошечную команду, которая будет импортировать эти данные в таблицу items.

Для начала создадим модель

php artisan make:model Item

Затем мы напишем команду, которая выглядит следующим образом:

storeFurniData();

        $this->newLine();
        return $this->info('Furni info fetched!');
    }

    private function getFurniDataUrl(): string
    {
        $hashUrl = Http::get(self::HASHES_URL);

        if (! $hashUrl->successful()) {
            $this->error('Furni data could not be fetched.');
        }

        $hashes = collect($hashUrl->json()['hashes']);
        $hashes = $hashes->mapWithKeys(fn($hash) => [$hash['name'] => $hash]);

        $furnidata = $hashes->get('furnidata');
        return "{$furnidata['url']}/{$furnidata['hash']}";
    }

    private function storeFurniData(): void
    {
        $data = Http::get($this->getFurniDataUrl());
        $data = collect($data->json());

        $data = $data->mapWithKeys(fn($items, $key) => [$key => $items]);
        $furniCount = $data->map(fn($items) => count($items['furnitype']))->flatten()->sum();

        $this->info("Trying to fetch {$furniCount} furnis.");
        $progressBar = $this->output->createProgressBar($furniCount);
        $progressBar->start();

        $data->each(fn($types, $type) => collect($types)->each(fn($items) => collect($items)->each(fn($item) => $this->addItem($item, $type, $progressBar))));

        $progressBar->finish();
    }

    private function addItem(array $furni, string $type, ProgressBar $bar): void
    {
        $item = new Item();
        $item->furni = json_encode($furni);
        $item->type = $type;
        $item->save();

        $bar->advance();
    }
}

В коде выше мы получаем URL-адрес данных furni, а затем перебираем элементы для хранения в нашей базе данных. Не забудьте закодировать информацию JSON, как мы делаем в этом примере при добавлении новых строк в таблицу!

Выполнив эту команду, мы получим нашу таблицу элементов, полную данных в течение нескольких секунд.

Обработка данных

Давайте посмотрим на JSON-информацию первой мебели с помощью простого выбора:

\App\Models\Item::first()->furni

{
	"bc": true,
	"id": 13,
	"name": "Beige Bookcase",
	"rare": false,
	"xdim": 1,
	"ydim": 1,
	"adurl": null,
	"buyout": true,
	"offerid": 5,
	"canlayon": false,
	"cansiton": false,
	"category": "shelf",
	"revision": 61856,
	"classname": "shelves_norja",
	"furniline": "iced",
	"canstandon": false,
	"defaultdir": 0,
	"partcolors": {
		"color": [
			"#ffffff",
			"#F7EBBC"
		]
	},
	"rentbuyout": false,
	"description": "For nic naks and books.",
	"environment": null,
	"rentofferid": -1,
	"specialtype": 1,
	"customparams": null,
	"excludeddynamic": false
}

Это то, что включено в первую строку нашей таблицы товаров в столбце furni. Как вы можете видеть, существует множество свойств, которые хранятся в одном столбце!

Приведение JSON к массиву

Можно преобразовать JSON в массив без необходимости использования json_decode. Все, что нам нужно сделать, это добавить это в нашу модель Item.

protected $casts = [
    'furni' => 'array'
];

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

Использование условий JSON Where

Представьте себе, что вы хотите только запросить замороженные предметы мебели, как это можно сделать?

Laravel eloquent предоставляет JSON where, которые помогут нам быстро это исправить:

\App\Models\Item::where('furni->furniline', 'iced')->get()

Как вы можете видеть, нам нужно только запросить столбец JSON с помощью оператора ->.

Запрос массивов JSON по их длине

Что делать, если мы хотим запросить мебель, которая имеет три цвета? Это можно сделать с помощью метода whereJsonLength, который проверит, сколько элементов имеет массив.

\App\Models\Item::whereJsonLength('furni->partcolors->color', 3)->get()

И это все, мы получили 534 предмета простым способом!

Обновление данных столбца JSON

Обновление данных JSON также очень легко сделать с помощью синтаксиса ->.

Мы изменим свойство rare на true:

\App\Models\Item::where('furni->furniline', 'rare')->update(['furni->rare' => true])

И дело сделано! Давайте проверим, что получилось:

\App\Models\Item::where('furni->furniline', 'rare')->get()

Обновление данных в Laravel


В этом уроке мы рассмотрим простой пример записи в блоге. Так что нам нужна Post модель. Вы можете легко создать модель, выполнив следующую команду.

php artisan make:model Post -m

После выполнения вышеуказанной команды в каталоге app/Models создается новый файл модели. Если вы используете более старую версию, чем Laravel 8, то она будет создана в app/ каталоге.
Флаг -m на приведенной выше команде обозначает, что файл миграции создается вместе с созданием модели. Таким образом, вы можете найти новые файлы миграции в папке database/migrations.

Теперь давайте откроем вновь созданные файлы миграции и обновим up() метод, как показано ниже:

Файл миграции

id();
            $table->string('title');
            $table->text('description');
            $table->timestamps();
        });
    }
 
    /**
     * Reverse the migrations.
     * One to many relationship tutorial
     * scratchcode.io
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

Теперь выполните следующую команду, чтобы создать posts таблицу в вашей базе данных:

php artisan migrate

Теперь давайте обновим записи в Laravel, следуя различным методам.

1. использование метода save()

Как следует из названия, для сохранения записей используется метод save (). В этом методе сначала нам нужно найти запись, а затем мы можем добавить в нее дополнительные данные, а затем сохранить записи. Таким образом, он обновит записи в базе данных.

$post = Post::find(1);
$post->title = "Updated title";
$post->description = "Updated description";
$post->save();

02 использование метода update ()

Метод update() используется для обновления записей, как следует из названия. Мы можем использовать его с условием where как показано ниже:

$affectedRecords = Post::where("id", 3)->update(["title" => "Updated title"]);

03 использование метода updateOrCreate()

Метод updateOrCreate() обновит запись, если она будет найдена, или создаст новую. Определите, что вы хотите обновить в первом аргументе. Второй аргумент этой функции уникален и ведет себя как условие where.

$post = Post::updateOrCreate(
    ['title' => 'New or update title', 'description' => 'this is description'],
    ['id' => 1] // Like where condition
);

04 обновление нескольких записей с помощью функции upsert() в Laravel

upsert() - очень интересная функция в Laravel. Эта функция используется для обновления нескольких записей в Laravel.

Вам просто нужно определить, что вы хотите обновить в первом аргументе, но с некоторыми уникальными полями, и во втором аргументе определить, какие поля уникальны для обновления, а в третьем аргументе перечислить поля, которые фактически будут обновлены в базе данных.

Мы попытались создать следующий пример для лучшего понимания.

Model::upsert([
     [ 'field1' => 'value', 'field2' => 'value', 'field3' => 'value', ........ ],
     [ 'field1' => 'value', 'field2' => 'value', 'field3' => 'value', ........ ],
     [ 'field1' => 'value', 'field2' => 'value', 'field3' => 'value', ........ ],
 ],
 [ 'field1', 'field2' ], // Unique field like where condition
 [ 'field3' ], // These fields will be updated in db
)

Давайте теперь поместим в него наш пост-пример. Так что у нас есть idtitle и description поля в таблице posts.

В том, что id является уникальным полем для нас, в то время как два других могут быть обновлены. Давайте обновим записи идентификаторов 11, 7 и 9 с помощью upsert()

Post::upsert([
   [ 'id' => 11, 'title' => 'update or create 11', 'description' => 'test 11' ],
   [ 'id' => 7,  'title' => 'update or create 7', 'description' => 'test 7' ],
   [ 'id' => 9,  'title' => 'update or create 9', 'description' => 'test 9' ],
 ],
 [ 'id' ], // Unique field like where condition
 [ 'title', 'description' ], // These fields will be updated in db
)

В этом обратном процессе upsert() ведет себя как обновление цикла. Таким образом, все 3 вышеперечисленные записи будут находиться в цикле title и description  столбце и обновляться с id условием where. Так просто, правда?