Рубрики
Software

Laravel: заметки

Уже давно было желание, на одном из проектов попробовать 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/