Уже давно было желание, на одном из проектов попробовать Laravel. Это популярный PHP фреймворк, примеры использования которого я постараюсь тут записывать. Возможно, они будут немного очевидны для опытного Laravel юзера, но я пока не такой.
Миграции в Laravel
Как изменить данные не удаляя информацию в таблицах? Просто создаем новую миграцию, указывая какую из таблиц будем изменять. Например, если нужно добавить столбик в таблицу products, используем команду:
php artisan make:migration update_templates --table=products
Это создаст новую миграцию, которую потом применяем при помощи команды: php artisan migrate.
Как удалить столбец, чтобы остальные данные остались? Снова же, создаем новую миграцию, но заполняем оба метода (up / down). Для удаления используем $table->dropColumn. Миграция будет выглядить примерно так (пример со stackoverflow.com):
Class RemoveCommentViewCount extends Migration
{
public function up()
{
Schema::table('articles', function($table) {
$table->dropColumn('comment_count');
$table->dropColumn('view_count');
});
}
public function down()
{
Schema::table('articles', function($table) {
$table->integer('comment_count');
$table->integer('view_count');
});
}
}
Время создания и обновления объектов. В Laravel есть много функций для моделей. В частности, при создании модели используется $table->timestamps(); Эта строка добавляет в таблицу 2 столбика:
- created_at
- updated_at
Есть один минус. По умолчанию не указано значение параметров. И при обновлении записи ничего не происходит. Сейчас рещшаю это подобным образом:
$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
Две строчик это больше, чем одна. Но зато в таблице не будет NULL и updated_at будет содержать актуальную информацию.
Конструктор запросов
В ситуации, когда необходимо достать с базы данных айди из одной таблицы, сравнить их с айди в другой таблице и вывести только те, которые отличаются, на уровне MYSQL это делается запросом типа:
SELECT * FROM exams WHERE exams.id NOT IN (SELECT examId FROM testresults)
В laravel можно использовать подобный код:
$result = DB::table('exams')->whereNotIn('id', function($q){
$q->select('examId')->from('testresults');
})->get();
Планировщик задач
В Laravel есть встроенный планировщик задач (Task Scheduling). Он позволяет вместить все cron-задачи в 1 файлик, который не будет зависить от сервера и позволит быстро и гибко переносить проекты. Для гибкой настройки задач, используем метод schedule класса App\Console\Kernel:
$schedule->call('App\Http\Controllers\ProductsControllerController@setstoproducts')->dailyAt('20:42');
Пример выше позволяет запустить функцию из определенного контроллера в нужное время.
Еще больше полезных и интересных решений можно найти в документации по Laravel: https://laravel.ru/docs/v5/