Как сделать миграцию laravel
Я не хочу запускать все выдающиеся миграции на 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 насколько требуется, и он будет проходить через миграции по одному за раз.
есть один простой способ, который я знаю, чтобы сделать это может быть доступен только для вас на просто локальный хост
- изменить ваш файл миграции по мере необходимости
- откройте phpMyAdmin или все, что вы используете, чтобы увидеть таблицу базы данных
- найдите нужную таблицу и бросьте ее
- найдите таблицу миграций и откройте ее
- в этой таблице в поле миграция найдите нужное имя таблицы и удалите его row
- наконец, выполните команду 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)
- сначала получаем модель нужного пользователя;
- для данной модели вызываем связывающий метод;
- т.к. один пользователь может иметь несколько записей, оператором where уточняем какой именно пост (id=2) нужно изменить;
- в методе 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');
>
>);
>
Читайте также: