zlt/lara-calls

laravel 的一系列实用方法

v0.0.2.5 2021-11-20 04:58 UTC

This package is auto-updated.

Last update: 2024-09-20 10:58:04 UTC


README

目录

安装

要求

  • php : ^7.3 或 ^8.0
  • laravel : ^8.0

通过 composer 安装

composer require zlt/lara-calls

发布配置文件。

php artisan vendor:publish --provider="Zlt\LaraCalls\LaraCallsServiceProvider"

配置文件将包含

return [
    /*
     * Define your eloquent builder class so that you can use custom Eloquent macros provided by package.
     */
    'builder' => \Illuminate\Database\Eloquent\Builder::class,

    /*
     * You may customize which macros you don't want to use.
     * Only macros provided below will not be registered.
     * Available Macros are 'onlyValues','pluckMultiple','updateOrCreateWhen','sortInValue','sortInValueDesc','groupAndSortBy','groupAndSortByDesc','calc_exec_time','validation'.
     */
    'exclude_macros' => [],
];

注意:如果您已经发布了配置,请更新 'laravel-macros' 配置中的 'macros' 以使用最新的方法。

可用方法

收集宏

  • OnlyValues

    此方法可用于 Collection 实例。这将返回仅有的值,并将丢弃第一级数组键。

    $collection = collect([
             [
                 'a' => 123,
                 'b' => 12,
             ],
             [
                 'a' => 12,
                 'b' => 31,
             ]
         ]);
    dd($collection->onlyValues()->toArray()); // [ [123,12],[12,31] ]; 
  • PluckMultiple

    此方法可用于 Collection 实例。此方法类似于 Eloquent Builder 上的 get()。您可以提取您想要的列及其值。您还可以提取嵌套属性(如果存在)。

    // $collection->pluckMultiple(array $keys);
    $collection = collect([
             [
                 'a' => 123,
                 'b' => 12,
             ],
             [
                 'a' => 12,
                 'b' => 31,
                 'c' => 32,
             ]
         ]);
    
    dd($collection->pluckMultiple(['a', 'b']));
    /*
    Illuminate\Support\Collection {
     all: [
            [ "a" => 123, "b" => 12,],
            [ "a" => 12, "b" => 31,],
       ],
    }
    */
    
    $collection = collect([
             [
                 'a' => 123,
                 'b' => 12,
                 'c' => [
                     'x' => 1,
                 ]
             ],
             [
                 'a' => 12,
                 'b' => 31,
                 'c' => [
                     'x' => 2,
                 ],
             ]
         ]);
    //pluck nested attribute 
    dd($collection->pluckMultiple(['a', 'c.x']));
    /*
    Illuminate\Support\Collection {
      all: [
             [ "a" => 123, "c.x" => 1,],
             [ "a" => 12, "c.x" => 2,],
           ],
        }
    */
  • SortInValue

    此方法将按升序排序特定属性的值。您还可以指定键以排序该属性的值。要按降序排序,请使用 sortInValueDesc

    // $collection->sortInValue(string $attributeToSort);
    // Sometimes you may sort attribute values by key of that attribute values. Then use $collection->sortInValue(string $attributeToSort,string $someKeyOfThatAttribute);
    $collection = collect([
          [
           'a' => [4,5,1,3]
          ],
          [
            'a' => [5,6,1,8]
          ]
    ]);
    $collection->sortInValue('a');
    /*
    Illuminate\Support\Collection {#4325
     all: [
       [
         "a" => Illuminate\Support\Collection {#4328
           all: [
             2 => 1,
             3 => 3,
             0 => 4,
             1 => 5,
           ],
         },
       ],
       [
         "a" => Illuminate\Support\Collection {#4322
           all: [
             2 => 1,
             0 => 5,
             1 => 6,
             3 => 8,
           ],
         },
       ],
     ],
    }
    */
    
    $collection = collect([
            [
                'a' => [
                    ['b' => 4],
                    ['b' => 5],
                    ['b' => 1],
                    ['b' => 3]]
            ],
            [
                'a' => [
                    ['b' => 5],
                    ['b' => 2],
                    ['b' => 6],
                    ['b' => 1]]
            ]
        ]);
    $collection->sortInValue('a','b'); // sort 'a' values by 'b' key of 'a'
    /*
    Illuminate\Support\Collection {#4348
     all: [
       [
         "a" => Illuminate\Support\Collection {#4347
           all: [
             2 => [
               "b" => 1,
             ],
             3 => [
               "b" => 3,
             ],
             0 => [
               "b" => 4,
             ],
             1 => [
               "b" => 5,
             ],
           ],
         },
       ],
       [
         "a" => Illuminate\Support\Collection {#4346
           all: [
             3 => [
               "b" => 1,
             ],
             1 => [
               "b" => 2,
             ],
             0 => [
               "b" => 5,
             ],
             2 => [
               "b" => 6,
             ],
           ],
         },
       ],
     ],
    }
    */  
  • SortInValueDesc

    此方法类似于 sortInValue 但按降序排序。

  • GroupAndSortBy

    此方法类似于 groupBy 但可以排序返回的集合。您还可以提供回调以按您喜欢的任何方式修改返回的集合。为了按降序排序返回的集合,您可能需要使用 groupAndSortByDesc 方法。

    //$collection->groupAndSortBy(string $attributeKeyToGroup,string $attributeKeyToSortAfterGroup,Closure $closureToAdjustSortedCollection);
     $collection = collect([
              [
                  'name' => 'James',
                  'age' => 20,
              ],
              [
                  'name' => 'Watson',
                  'age' => 24,
              ],
              [
                  'name' => 'James',
                  'age' => 15,
              ]
          ]);
    
     dd($collection->groupAndSortBy('name','age')); 
    /*
     Illuminate\Support\Collection^ {#4321
               #items: array:2 [
           "James" => Illuminate\Support\Collection^ {#4322
             #items: array:2 [
               1 => array:2 [
                 "name" => "James"
                 "age" => 15
               ]
               0 => array:2 [
                 "name" => "James"
                 "age" => 20
               ]
             ]
           }
           "Watson" => Illuminate\Support\Collection^ {#4325
             #items: array:1 [
               0 => array:2 [
                 "name" => "Watson"
                 "age" => 24
               ]
             ]
           }
         ]
      }
      */
    
     $collection = collect([
              [
                  'name' => 'James',
                  'age' => 20,
              ],
              [
                  'name' => 'Watson',
                  'age' => 24,
              ],
              [
                  'name' => 'James',
                  'age' => 15,
              ]
          ]);
    
     dd($collection->groupAndSortBy('name','age',function($collection){
         return $collection->where('age','>=',24);
     })); // after group and sorted, adjust the sorted collection
          /*
     Illuminate\Support\Collection^ {#4313
         #items: array:2 [
           "James" => Illuminate\Support\Collection^ {#4311
             #items: []
           }
           "Watson" => Illuminate\Support\Collection^ {#4309
             #items: array:1 [
               0 => array:2 [
                 "name" => "Watson"
                 "age" => 24
               ]
             ]
           }
         ]
       }
      */
  • GroupAndSortByDesc

    groupAndSortByDesc 方法类似于 groupAndSortBy 但返回的集合按降序排序。

  • 验证

    验证集合并执行后续的 onSuccessonError 处理。为了验证,您可以提供 验证规则数组或闭包。如果您提供验证规则,您可以在 onError 闭包中提供一个参数,该参数将是 \Illuminate\Support\MessageBag 的实例。

    //$collection->validation(array|Closure $rulesOrClosure)->onSuccess(Closure $closure)->onError(Closure $closure);
    $collection = collect(['name'=>'John','email'=>'email@mail.com']);
    
    $collection->validation(['name'=>'string','email'=>'email'])
               ->onSuccess(function($collection){
                  // This will be processed              
                  return $collection;
               })->onError(function($messageBag){
                  // This will be skipped
                  return $messageBag->toArray();
               });
    
    $collection = collect(['name'=>'John','email'=>'email']);
    
    $collection->validation(['name'=>'string','email'=>'email'])
               ->onSuccess(function($collection){
                  //This step will be skipped.                
                  return $collection;
               })->onError(function($messageBag){
                  return $messageBag->toArray();
               }); // [ "email" => [ "The email must be a valid email address.", ], ]
    
    $collection->validation(function($collection){
                  return false; //Return type must be 'boolean'.Otherwise, it will always return false.})
               ->onSuccess(function($collection){
                  //This step will be skipped.
                  return $collection;
               })->onError(function(){
                 //Perform some process after failing validation
               });

构建宏

  • updateOrCreateWhen

    此方法类似于 Laravel 的 updateOrCreate 方法,但它接受闭包以确定如果值已存在则是否更新。您可以使用此方法与 Eloquent 一起使用。
    $food = Food::updateOrCreateWhen(['name' => 'sushi',], [
        'price' => 100,
    ]);
    
    dd($food->price); //100
    
    $food = Food::updateOrCreateWhen(['name' => 'sushi'], [
        'price' => 200
    ], function ($oldValue, $newValue) {
        return true;
    });
    
    dd($food->price); //200;
    
    $food = Food::updateOrCreateWhen(['name' => 'sushi'], [
        'price' => 300
    ], function ($oldValue, $newValue) {
        return false;
    });
    
    dd($food->price); //200;

全局辅助函数

  • 计算执行时间

    计算您的函数执行时间(以秒为单位)。
    $time = calc_exec_time(function(){
    sleep(5);
    return 'test';
    });
    dd($time); //"5.0008"