Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

参考

Laravel v6.5.0 released

私はLaravel初心者です。間違いなどありましたら教えていただけるとありがたいです。

LazyCollection::remember()

https://github.com/laravel/framework/pull/30443

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()

https://github.com/laravel/framework/pull/30507

  • 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()

https://github.com/laravel/framework/pull/30495

今まではこう書いていたのを、

        $has = Todos::exists();

        if ($has) {
            // Todosにデータがある場合の処理
        }

コールバック関数で書けるようになりました。

        Todos::existsOr(function () {
            // Todosにデータがなければ実行される関数
        });

        Todos::doesntExistOr(function () {
            // Todosにデータがあれば実行される関数
        });

Bladeのカスタム条件を定義することで使えるディレクティブにunlessが追加

https://github.com/laravel/framework/pull/30492

まず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

okumurakengo
人が作ってくれたご飯食べるときに何も言わずに食べるのは、ちょっとダメらしいという話を聞いたことがあるので、「あ、うめ、あ、うめ」って言いながら食ってたら、すごい変な人と思われてしまってしまった/初心者です、あまりわかっていません
https://bokete.jp/user/okumurakengo
qiitadon
Qiitadon(β)から生まれた Qiita ユーザー・コミュニティです。
https://qiitadon.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away