$model->touch();
これだけです、これだけで下記のようなSQL文が実行されます
[query] => update `MY-TABLE` set `updated_at` = ? where `id` = ?
[bindings] => Array
(
[0] => 2018-10-17 22:44:43
[1] => 16090
)
フレームワークによってはコントローラーを直接CLIから叩けるものもありますが、 Laravelの場合はコマンドを用意する必要があるようです。 (とはいえ artisan コマンドが用意されているので簡単です。)
コマンド名は
make:auth
make:migration
のように(makeグループの中のauth)みたいな感じで、グルーピングされていますので、
自作コマンドもグルーピングしておくと、コマンドが増えた時に一覧表示で見やすくなります。
今回作成するコマンドは
myapp:print
とします。
myapp:print コマンドを作成する時には次のように入力します
php artisan make:command MyappPrint
するとファイル app/Console/Commands/MyappPrint.php が自動生成されます。
app/Console/Commands/MyappPrint.php を以下のようにします
protected $signature = 'myapp:print'; にコマンド名をセットします。
protected $description = 'MYAPP:にコマンドの説明をセットします。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MyappPrint extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'myapp:print';
/**
* The console command description.
* @var string
*/
protected $description = 'MYAPP: ハローと表示します';
/**
* Create a new command instance.
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
// ここにロジックを記述
echo 'Hello Myapp Command !!!' . "\n";
}
}
php artisan myapp:print
結果
Hello Myapp Command !!!
protected $signature = 'myapp:print';
↓
protected $signature = 'myapp:print {id}';
と変更します。
「引数なし」を許可するには
protected $signature = 'myapp:print {id?}';
とします。
public function handle()
{
// ここにロジックを記述
$id = $this->argument('id');
echo 'Hello Myapp Command !!!' . "\n";
echo $id;
}
ターミナルから実行時に引数を渡します
php artisan myapp:print
Laravel で定期実行させるにはまず cron で毎分ごとにLaravelのスケジューラを実行させ、その中でLaravelで設定した時間ごとにコマンドを自動実行します。
crontab -e
crontabの書式に沿って以下のように記述します
* * * * * php7 /YOUR/APP/PATH/artisan schedule:run >> /dev/null 2>&1
コマンド「myapp:getdata」を1分ごとに起動するように設定します。
protected function schedule(Schedule $schedule)
{
// RSSからデータを取得 (1分ごと)
$schedule->command('myapp:getdata')->everyMinute();
}
以上です。 ログを見て定期実行が行われているか確認します。
スケジュールは以下のように設定できます。
メソッド | 説明 |
---|---|
->cron('* * * * * *'); |
CRON記法によるスケジュール |
->everyMinute(); |
毎分タスク実行 |
->everyFiveMinutes(); |
5分毎にタスク実行 |
->everyTenMinutes(); |
10分毎にタスク実行 |
->everyFifteenMinutes(); |
15分毎にタスク実行 |
->everyThirtyMinutes(); |
30分毎にタスク実行 |
->hourly(); |
毎時タスク実行 |
->hourlyAt(17); |
一時間ごと、毎時17分にタスク実行 |
->daily(); |
毎日深夜12時に実行 |
->dailyAt('13:00'); |
毎日13:00に実行 |
->twiceDaily(1, 13); |
毎日1:00と13:00時に実行 |
->weekly(); |
毎週実行 |
->monthly(); |
毎月実行 |
->monthlyOn(4, '15:00'); |
毎月4日の15:00に実行 |
->quarterly(); |
四半期ごとに実行 |
->yearly(); |
毎年実行 |
->timezone('America/New_York'); |
タイムゾーン設定 |
cronでコマンドが呼ばれているかを確認するには
php artisan schedule:run
としますが、あらかじめ メソッドの修正が必要です!(重要)
1分に変更しないと、No scheduled commands are ready to run. が出て終了してしまいます。
また、重複起動を回避するメソッド withoutOverlapping() も外しておきましょう。
protected function schedule(Schedule $schedule)
{
$schedule->command('myapp:getdata')->everyMinute();
php artisan schedule:run
とします。
これで必ず設定されたタスクが走るので、ログを見て動作を確認します。
どうやら withoutOverlapping() はデッドロックを自動で解除できないようです。
composer require diglactic/laravel-breadcrumbs
古いLaravelにインストールする場合はこちら
composer require davejamesmiller/laravel-breadcrumbs:5.x
routes/breadcrumbs.php を以下の内容で作成します
<?php
// Home
Breadcrumbs::for('home', function ($trail) {
$trail->push('Home', route('home'));
});
// Home > About
Breadcrumbs::for('about', function ($trail) {
$trail->parent('home');
$trail->push('About', route('about'));
});
次の設定ファイルを生成コマンドを実行します
php artisan vendor:publish --provider="DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider"
ビューファイル(XXXXX.blade.php)に以下のように記述します
{{ Breadcrumbs::render('home') }}
もしくは、Route::currentRouteName() で現在のルーティングが取得できるので
{{ Breadcrumbs::render(Route::currentRouteName()) }}
としておくとビューファイルは触らなくてもいいので楽です。(レイアウトファイルにパンくずを設置してある場合はこちらがおすすめです。)
自作のパンくずリストテンプレートを使用するには config/breadcrumbs.php を編集します
25行目を次のように書き換えます
### 'view' => 'breadcrumbs::bootstrap4',
'view' => 'my_breadcrumbs',
すると、テンプレートファイルviews/breadcrumbs.blade.phpを見に行くようになります。
テンプレートファイルを用意する
views/breadcrumbs.blade.php
(以下は例です。適宜書き換えてください。)
@if (count($breadcrumbs))
<ol class="navbar__breadcrumb breadcrumb d-none d-sm-flex">
@foreach ($breadcrumbs as $breadcrumb)
@if ($breadcrumb->url && !$loop->last)
<li class="breadcrumb-item"><a href="{{ $breadcrumb->url }}">{{ $breadcrumb->title }}</a></li>
@else
<li class="breadcrumb-item active">{{ $breadcrumb->title }}</li>
@endif
@endforeach
</ol>
@endif
以上です。 とても簡単にパンくずリストが出来るのでLaravelを使っている場合は必須ともいえるでしょう。
これも便利です。blade.php ファイルにページタイトルを記述しなくても自動的にセットされます。
<title>{{ ($breadcrumb = Breadcrumbs::current()) ? $breadcrumb->title : 'No Name' }}</title>
Laravelで「ファイルを更新したのに更新されてない?」
という時はキャッシュが残っている可能性が大です。
こちらのコマンドでキャッシュを削除しましょう。
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
composer dump-autoload
php artisan cache:clear; php artisan config:clear; php artisan route:clear; php artisan view:clear; composer dump-autoload
PackageCreator がとても便利です
https://github.com/SUKOHI/PackageCreator
composer require sukohi/package-creator
インストールすると「make:package コマンド」が使用できるようになります
php artisan make:package (ベンダー名) (パッケージ名) (保存するフォルダ名(アプリケーションからの相対パス) )
php artisan make:package myname my-package test_packages
./test_packages/Myname/MyPackage/src/Facades/MyPackage.php
./test_packages/Myname/MyPackage/src/MyPackage.php
./test_packages/Myname/MyPackage/src/MyPackageServiceProvider.php
./test_packages/Myname/MyPackage/composer.json
例として mydump クラスを作成してみます。
php artisan make:package myname mydump mypackages
APP/mypackages/MyName/Mydump/src/Mydump.php を編集して以下の内容にします
<?php
namespace MyName\Mydump;
class Mydump {
public static function dump( $mix )
{
print "\n".'<pre style="text-align:left;display:block;padding:9.5px;margin:10px;font-size:13px;line-height:1.4;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;">'."\n";
print '<span style="color:#999;">TYPE: ' . gettype($mix) . "</span>\n";
print_r($mix);
print "\n</pre>\n\n";
}
public static function dump2( $mix )
{
print "\n"."<!--"."\n";
print "\n".'<pre style="text-align:left;display:block;padding:9.5px;margin:10px;font-size:13px;line-height:1.4;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;">'."\n";
print '<span style="color:#999;">TYPE: ' . gettype($mix) . "</span>\n";
print_r($mix);
print "\n</pre>\n\n";
print "\n"."-->"."\n";
}
}
APP/config/app.php の「providers」と「aliases」に以下を追加します
'providers' => [
.....................
MyName\Mydump\MydumpServiceProvider::class,
'aliases' => [
.....................
'Mydump' => MyName\Mydump\Facades\Mydump::class,
composer.json を以下のように修正します
"psr-4": {
"App\\": "app/"
}
↓
"psr-4": {
"App\\": "app/" ,
"MyName\\Mydump\\": "mypackages/MyName/Mydump/src"
}
composer dumpautoload -o
php artisan config:cache
use Mydump;
$mix = [
'aaa' => 'bbb' ,
'ccc' => 'ddd' ,
];
Mydump::dump( $mix );
use Illuminate\Support\Facades\Schema;
category テーブルのカラムを配列で取得する
$columns = Schema::getColumnListing('category');
dump($columns);
$data = $model->orderBy('id', 'desc')->paginate( 10 );
dump( $model->toSql() );
\DB::enableQueryLog();
$data = $model->orderBy('id', 'desc')->paginate( 10 );
dump(\DB::getQueryLog());
$query = \DB::table('users')
->where('status', '<>', 1);
var_dump($query->toSql(), $query->getBindings());