参考
私はLaravel初心者です。間違いなどありましたら教えていただけるとありがたいです。
LazyCollection::remember()
remember()
を呼び出すと、コレクションの列挙を記憶する新しいLazyCollectionが返されます。
DBから取ってきた値をキャッシュして使いまわすことができる。
// LazyCollectionの例
$todos1 = Todos::cursor();
$todos1->all(); // データ取得
$todos1->all(); // データ取得
// LazyCollectionからremomberを呼び出した例
$todos2 = Todos::cursor()->remember();
$todos2->all(); // データ取得
$todos2->all(); // rememberのキャッシュからデータ取得するのでsqlは実行しない
ジェネレーター関数でLazyCollectionを作成する例でも試してみました。
フィボナッチ数列を返す以下のジェネレータで確認します。
まずremember()
を使わない例を確認します。
$fibonacci = LazyCollection::make(function () {
echo 'ジェネレータ関数からをLazyCollection作成' . PHP_EOL;
[$a, $b] = [0, 1];
while (true)
yield [$a, $b] = [$b, $a + $b];
});
foreach($fibonacci->take(5)->all() as [$a]) echo $a . PHP_EOL;
echo '-----' . PHP_EOL;
foreach($fibonacci->take(10)->all() as [$a]) echo $a . PHP_EOL;
ジェネレータ関数からをLazyCollection作成
1
1
2
3
5
-----
ジェネレータ関数からをLazyCollection作成
1
1
2
3
5
8
13
21
34
55
次にremember()
を使った例をみてみます
$fibonacci = LazyCollection::make(function () {
echo 'ジェネレータ関数からをLazyCollection作成' . PHP_EOL;
[$a, $b] = [0, 1];
while (true)
yield [$a, $b] = [$b, $a + $b];
- });
+ })->remember();
foreach($fibonacci->take(5)->all() as [$a]) echo $a . PHP_EOL;
echo '-----' . PHP_EOL;
foreach($fibonacci->take(10)->all() as [$a]) echo $a . PHP_EOL;
ジェネレータ関数からをLazyCollection作成
1
1
2
3
5
-----
1
1
2
3
5
8
13
21
34
55
ジェネレータ関数からをLazyCollection作成
の部分が最初の一回だけ実行されています。
列挙した値(yeild
で指定している値)をキャッシュして、2回目以降はその値を返すだけですので、このような動作になっているようです。
Str::afterLast()
Str::beforeLast()
-
Str::afterLast()
指定された値が最後に出現した後の文字列を返す -
Str::beforeLast()
指定された値が最後に現れる前の文字列を返す
$type = 'App\Notifications\Tasks\TaskUpdated';
echo Str::afterLast($type, '\\') . PHP_EOL; // TaskUpdated
echo Str::beforeLast($type, '\\') . PHP_EOL; // App\Notifications\Tasks
$filename = 'photo.2019.11.04.jpg';
echo Str::afterLast($filename, '.') . PHP_EOL; // jpg
echo Str::beforeLast($filename, '.') . PHP_EOL; // photo.2019.11.04
existsOr()
doesntExistOr()
今まではこう書いていたのを、
$has = Todos::exists();
if ($has) {
// Todosにデータがある場合の処理
}
コールバック関数で書けるようになりました。
Todos::existsOr(function () {
// Todosにデータがなければ実行される関数
});
Todos::doesntExistOr(function () {
// Todosにデータがあれば実行される関数
});
Bladeのカスタム条件を定義することで使えるディレクティブにunless
が追加
まずBladeのカスタム条件を定義
参考:https://laravel.com/docs/5.8/blade#custom-if-statements
use Illuminate\Support\Facades\Blade;
// ...
public function boot()
{
Blade::if('env', function ($environment) {
return app()->environment($environment);
});
}
これで @名前
、@else名前
、@end名前
がbladeテンプレート内で使えるようになりました。
今回の例では @env
、@elseenv
、@endenv
と書くことで使えます。
@env('local')
// .envのAPP_ENVがlocal
@elseenv('testing')
// .envのAPP_ENVがtesting
@else
// その他
@endenv
6.5は↑にプラスして@unless名前
(今回の例では@unlessenv
)が新たに使えるようになりました。
@unlessenv('local')
// .envのAPP_ENVがlocal以外
@endenv
以上です。見ていただいてありがとうございました。m(_ _)m