Как сделать миграцию laravel

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

Я не хочу запускать все выдающиеся миграции на laravel 4. У меня 5 миграций. Теперь я просто хочу запустить одну миграцию. вместо этого: php artisan migrate Я хотел бы запустить одну конкретную миграцию: php artisan migrate MY_MIGRATION_TO_RUN

Похоже, вы делаете это неправильно.

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

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

Если вам действительно нужно выполнить что-то в вашей базе данных, вам лучше создать сценарий DDL и вручную выполнить его на своем веб-сервере.

или просто создайте новую миграцию и выполните ее с помощью artisan.

EDIT:

Если вам нужно сначала запустить его, вам нужно сначала создать его.

Если вам просто нужно изменить их порядок, переименуйте файл в первый. Миграции создаются с timestemp:

чтобы создать новую миграцию перед этой, вы можете назвать ее

просто переместите уже выполненные миграции из папки app/config/database/migrations/. Затем выполните команду php artisan migrate . Сработало как по волшебству .

хороший маленький фрагмент, чтобы облегчить любые страхи при запуске Laravel 4 миграции php artisan migrate --pretend . Это выведет только SQL, который был бы запущен, если вы выполнили фактическую миграцию.

похоже, что ваши начальные 4 миграции уже запущены. Я бы догадался, что когда вы php artisan migrate он будет запускать только новую, недавнюю миграцию.

совет: убедитесь, что все ваши up() и down() работают так, как вы ожидаете. Мне нравится бегать вверх(), вниз (), вверх (), когда я бегу . миграции, просто чтобы проверить их. было бы ужасно для вас получить 5-6 миграций и понять, что вы не можете откатить их без проблем, потому что вы не соответствовали down() с up() 100% процентов.

просто мои два цента! Надеюсь --pretend помогает.

вы можете поместить миграции в другие папки и запустить что-то вроде:

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

затем снова запустите php artisan migrate.

вы можете создать отдельный каталог для миграции с вашего терминала следующим образом:

а затем переместите конкретную миграцию, которую вы хотите запустить в этот каталог, и выполните следующую команду:

надеюсь, что это помогает!

Я дал ответ на другой пост, но вы можете сделать это: запустить artisan migrate чтобы запустить все миграции, затем следующие команды SQL для обновления таблицы миграций, что делает его похожим на миграции были запущены по одному:

это изменит столбец пакета на 1, 2, 3, 4 .. так далее. Добавить WHERE batch>=. условие там (и обновите начальное значение @a ) Если вы хотите повлиять на определенные миграции.

после этого, вы можете artisan migrate:rollback насколько требуется, и он будет проходить через миграции по одному за раз.

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

  1. изменить ваш файл миграции по мере необходимости
  2. откройте phpMyAdmin или все, что вы используете, чтобы увидеть таблицу базы данных
  3. найдите нужную таблицу и бросьте ее
  4. найдите таблицу миграций и откройте ее
  5. в этой таблице в поле миграция найдите нужное имя таблицы и удалите его row
  6. наконец, выполните команду php artisan migrate из командной строки или терминала. это приведет только к миграции тех таблиц, которые не существуют в таблице миграции в базе данных.

этот путь совершенно безопасен и не сделает никакие ошибки или проблемы пока он смотрит как непрофессиональный путь но он все еще работает совершенно.

Если это только для целей тестирования, вот как я это делаю:

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

пока я тестирую приложение, и не все миграции уже настроены, я просто перемещаю их в новую папку "будущее". Этот фолд не будет затронут ремесленником, и он будет выполнять только миграцию, которую вы хотите.

грязный обходной путь, но он работает.

Если вы хотите запустить свой последний файл миграции, вы должны сделать следующее:

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

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

также вы можете изменить (уменьшить) batch количество столбцов в migrations таблица ;)

и затем запустить php artisan migrate .

бросьте исключение в миграции, если вы не хотите его применять, и это остановит весь процесс миграции.

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

Так Просто. просто перейдите в папку миграции. переместить все файлы миграции в другую папку. затем верните все миграции один за другим в папку миграции и запустите миграцию для одного из них(php artisan). когда вы вставляете плохой файл миграции в главную папку миграции и запускаете php artisan migrate в командной строке, будет ошибка.


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

  • users – родительская таблица;
  • customers – дочерняя таблица.

Пример создания файла миграции в консоли.

Создать пустой файл миграции с названием CreateRoleTables:

Примеры миграций для создания связывающего поля/таблицы и внешних ключей.

Миграция – создание связывающего поля с внешним ключом (связь один к одному и один ко многим).
Миграция для создания таблицы 'countries' со связывающим полем и внешним ключом:

Имя внешнего ключа должно быть - название владеющей модели (родительской таблицы в единственном числе) плюс _id (тут 'user_id') или указывать явно в связывающем методе модели.

Миграция - создания дополнительного, связывающего поля в существующую таблицу с внешним ключом.

Миграция – создание связывающей таблицы (для связи многие ко многим).

Пример связывания таблиц roles и users.
Создаем таблицу role_user. Название ее не случайно - указываются две связываемые таблицы roles и users через нижнее подчеркивание в единичном числе. Или же произвольное название и тогда указывается явно в модели, в связывающем методе belongsToMany() в качестве второго аргумента.

Выборка данных, создание связывающих методов моделей.

Связь "один к одному".

Например, в таблице countries создан внешний ключ для связи с таблицей users. В таком случае, таблица users является родительской и нужно создать метод hasOne() в классе ее модели User, а для модели Country создать метод belongsTo().

Создание метода для модели User:

Eloquent (реализация шаблона ActiveRecord в Larave) считает, что внешний ключ отношения называется по имени модели. В данном случае предполагается, что это user_id. Если вы хотите перекрыть стандартное имя, передайте второй параметр методу hasOne():

Получение связи (в таблице 'countries') для пользователя с > вызываем не метод, а одноименное динамическое свойство.

Создание обратной связи (для таблицы с которой связывали).
Метод модели:

получение данных аналогичное:

Связь "Один ко многим".

Создание метода для модели User:

Получение данных:
вызываем не метод, а одноименное динамическое свойство.

Создание обратной связи (для таблицы с которой связывали).
Метод модели Post:

Связь "Многие ко многим".

Связываем две таблицы: roles и users создав таблицу с названием role_user. При использовании произвольного имени связывающей таблицы- название указывается явно вторым аргументом в методе belongsToMany():
так же можно перекрыть имена ключей по умолчанию:

Создание метода.
Для модели User:

Для модели Role:

Получение данных:
как и для других связей, вызываем не метод, а одноименное динамическое свойство "roles".
Для обратной связи (другой модели), получение данных проводится аналогично.

Проверка связей при выборке.

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

Например нужно отобрать всех пользователей, которые написали какие-то посты (имеют связь с таблицей постов – в таблице posts поле user_id соответствует id пользователя):

можно указать кол-во связей, которое должно быть:

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

Если использовать не динамическое свойство а метод связи.

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

При использовании могут возникнуть конфликты если в условии используются поля с одинаковыми названиями для разных таблиц. В таком случае нужно уточнять к какой таблице относится поле. Например:

Вставка данных.

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

Один из 2-х способов:
или

Сохранить несколько связанных моделей можно так:

Аналогично и вставка для связи многие ко многим (через связывающую таблицу).
Пример.
Нужно создать пользователя с указанными данными и присвоить ему статус админа (в таблице roles соответствует > или
в данном случае, создастся указанный пользователь в таблице users, а так же в связывающей таблице “role_user” создастся связывающая запись.

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

Например нужно для пользователя под (таблица users) обновить поле 'text' из связанной таблицы постов (posts)

  1. сначала получаем модель нужного пользователя;
  2. для данной модели вызываем связывающий метод;
  3. т.к. один пользователь может иметь несколько записей, оператором where уточняем какой именно пост (id=2) нужно изменить;
  4. в методе update() указываем поля и их новые значения.

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

В документации и учебниках по Laravel везде рассказано как создать таблицу, причём создаётся она от имени пользователя root. Работать с правами пользователя root очень плохая привычка даже на локальном сервере разработчика. Пользователь БД должен иметь минимум прав. В идеале только создавать и даже не все данные просматривать. Парво редактирования должно быть только на необходимые поля, а не на все вообще. Прав delete быть вообще не должно. Записи могут помечаться к удалению, как бы отправляясь в архив. А реальное удаление, если и будет производиться, то уже с задержкой и с правами другого пользователя.

Теперь создададим пару таблиц, их может быть несколько. Проверим как работает откат миграций назад. Тут, как раз, новичка и поджидают нетривиальные сложности, которые не описаны в документации. В теории всё хорошо выглядит когда нужно откатиться на один шаг назад. Кстати, откад назад идёт не по количеству файлов миграции, а по количеству Batch который отображается в команде php artisan migrate:status. В одной партии может быть несколько фалов миграции. php artisan migrate:refresh --step=2 будет означать, что откатываемся назад на миграции из двух последних партий. Итак, проделаем следующие команды, создадим и удалим пару таблиц.

В реальной жизни вам скорее придётся удалять таблицу, которую создали когда-то давно. И тут откат назад не подходит, так как приведёт к удалению таблиц, которые были созданы после таблицы, которую нам нужно удалить. А на рабочем проекте уже в таблицах данные. Поэтому придётся создать пустую миграцию php artisan make:migration drop_table_name в методе up которой прописать Schema::dropIfExists('table_name');

Миграции будут хранить всю историю изменения структуры БД.

Для созадния структуры таблиц и заполнения данными используйте следующий код.

Миграции - упрощенная система контроля версий для БД, которая позволяет отслеживать изменения и создавать таблицы БД, используя команды консоли.

'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],

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

Метод up выполняется, когда мы выполняем конкретную миграцию. Метод down выполняется, когда мы отменяем миграцию, когда откатывем изменения.

increments('id'); // id INT AUTO_INCREMENT PRIMARY KEY
$table->timestamps(); // здесь будет храниться время создания и модификации конкретной записи
>);
>

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('articles');
>
>

public function up()
Schema::create('articles', function (Blueprint $table) $table->increments('id');
$table->string('name', 100); // поле для названия статей varchar 100 символов
$table->text('text', 100); // текст статьи
$table->string('img', 255); // картинка
$table->timestamps();
>);
>

public function up()
Schema::table('articles', function (Blueprint $table) //
$table->string('alias', 100);
>);
>

public function down()
Schema::table('articles', function (Blueprint $table) //
$table->dropColumn('alias'); // удалим столбец
>);
>

public function up()
if(Schema::hasTable('articles')) Schema::table('articles', function (Blueprint $table) <
$table->string('alias', 100);
>);
>

public function up()
if(Schema::hasTable('articles')) Schema::table('articles', function (Blueprint $table) <
if(!Schema::hasColumn('alias')) $table->string('alias', 100);
>
>);
>

При создании таблицы, мы можем указать движок таблицы. В файле 2017_07_06_164539_create_articles_table.php

public function up()
Schema::create('articles', function (Blueprint $table) //$table->engine = 'InnoDB';
$table->increments('id');
$table->string('name', 100); // поле для названия статей varchar 100 символов
$table->text('text', 100); // текст статьи
$table->string('img', 255); // картинка
$table->timestamps();
>);
>

public function up()
if(Schema::hasTable('articles')) Schema::table('articles', function (Blueprint $table) <
if(!Schema::hasColumn('alias')) $table->string('alias', 100)->default('default');
>
>);
>

Читайте также: