4
1

More than 3 years have passed since last update.

Laravel 6.5で追加されたメソッドを試してみた

Posted at

参考

Laravel v6.5.0 released

私は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

/app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Blade;

// ...

    public function boot()
    {
        Blade::if('env', function ($environment) {
            return app()->environment($environment);
        });
    }

これで @名前@else名前@end名前がbladeテンプレート内で使えるようになりました。
今回の例では @env@elseenv@endenv と書くことで使えます。

blade
@env('local')
    // .envのAPP_ENVがlocal
@elseenv('testing')
    // .envのAPP_ENVがtesting
@else
    // その他
@endenv

6.5は↑にプラスして@unless名前(今回の例では@unlessenv)が新たに使えるようになりました。

blade
@unlessenv('local')
    // .envのAPP_ENVがlocal以外
@endenv

以上です。見ていただいてありがとうございました。m(_ _)m

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1