zoukankan      html  css  js  c++  java
  • laravel一些小技巧

    2021年5月11日16:20:39

    2021年4月29日16:10:18
    
    推荐的几个关于laravel的wiki
    https://learnku.com/docs/laravel-cheatsheet/8.x
    https://learnku.com/laravel/wikis/25574
     
    1,海量数据应用上的某些限制 1390 Prepared statement contains too many placeholders
     
    /*
             * 只跑没有邀请关系的表的用户
             * 1390 Prepared statement contains too many placeholders
             * 联表查询的时候,注意这里因为占位符太多导致的,分批量查询
             */
            $u = UUser::with('UUserInvitRelationship')->select(['id', 'phone', 'invite_people_id'])->get()->toArray();
            if (!empty($u)) {
                foreach ($u as $k => $v) {
                    if (!empty($v['u_user_invit_relationship'])) {
                        continue;
                    }
                    $p = new PullNewRelationshipService();
                    $p->runUserInvitRelationship($v);
                }
            }
    这里注意 Prepared statement 最多支持65535个占位变量,所以在大量数据的时候,如果需要做数据批量执行,就分块,或者分批,或者更换检索条件
     
    2,laravel 常用扩展包
    扩展包 一句话描述 本项目应用场景
    Intervention/image 图片处理功能库 用于图片裁切
    guzzlehttp/guzzle HTTP 请求套件 请求百度翻译 API
    predis/predis Redis 官方首推的 PHP 客户端开发包 缓存驱动 Redis 基础扩展包
    barryvdh/laravel-debugbar 页面调试工具栏 (对 phpdebugbar 的封装) 开发环境中的 DEBUG
    spatie/laravel-permission 角色权限管理 角色和权限控制
    mewebstudio/Purifier 用户提交的 Html 白名单过滤 帖子内容的 Html 安全过滤,防止 XSS 攻击
    hieu-le/active 选中状态 顶部导航栏选中状态
    summerblue/administrator 管理后台 模型管理后台、配置信息管理后台
    viacreative/sudo-su 用户切换 开发环境中快速切换登录账号
    laravel/horizon 队列监控 队列监控命令与页面控制台 /horizon
     
    3,laravel中 name方法的使用
    laravel提供了很多magic方法来,先来讲讲命名路由的使用,有两种方法非常便捷。
    命名路由让你可以更方便的为特定路由生成 URL 或进行重定向。你可以使用 as 数组键指定名称到路由上
    1、第一种:通过route路由中的as关键字来实现 Route::get('api/user',['as'='web.user'],'messageController@userInformation');
     
    2、第二种:通过Route的magic方法name来实现命名路由 Route::get('api/user','messageController@userInformation')->name('web.user');
     
    3、如何使用
    在代码中可以这样使用
    this->visit(route('web.user'))
    在模板中这样使用
    user
     
    3,laravel配置数据里有特殊字符的时候
    .env文件里密码设置加上 单引号 或者 双引号 包住
     
    4,laravel常用细节总结
    4.1. 在 find 方法中指定属性
    User::find(1, ['name', 'email']);
    User::findOrFail(1, ['name', 'email']);
     
     
    4.2. Clone 一个 Model
     
    用 replicate 方法可以克隆一个 Model
    $user = User::find(1);
    $newUser = $user->replicate();
    $newUser->save();
     
     
    4.3. 判断两个 Model 是否相同
     
    检查两个 Model 的ID是否相同用 is 方法
    $user = User::find(1);
    $sameUser = User::find(1);
    $diffUser = User::find(2);
    $user->is($sameUser); // true
    $user->is($diffUser); // false;
     
     
    4.4. 重新加载一个 Mode
    $user = User::find(1);
    $user->name; // 'Peter'
    // 如果 name 更新过,比如由 peter 更新为 John
    $user->refresh();
    $user->name; // John
     
     
    4.5. 加载新的 Model
    $user = User::find(1);
    $user->name; // 'Peter'
    // 如果 name 更新过,比如由 peter 更新为 John
    $user->refresh();
    $user->name; // John
     
     
    4.6. 更新带关联的 Model
     
    在更新关联的时候,使用 push 方法可以更新所有 Model
     
     
    class User extends Model
    {
      public function phone()
      {
      return $this->hasOne('AppPhone');
      }
    }
    $user = User::first();
    $user->name = "Peter";
    $user->phone->number = '1234567890';
    $user->save(); // 只更新 User Model
    $user->push(); // 更新 User 和 Phone Model
     
     
    4.7. 自定义软删除字段
     
    Laravel 默认使用 deleted_at 作为软删除字段,我们通过以下方式将 deleted_at 改成 is_deleted
     
     
    class User extends Model
    {
      use SoftDeletes;
      * deleted_at 字段.
      *
      * @var string
      */
      const DELETED_AT = 'is_deleted';
    }
    或者使用访问器
     
     
    class User extends Model
    {
      use SoftDeletes;
     
      public function getDeletedAtColumn(){
        return 'is_deleted';
      }
    }
     
     
    4.8. 查询 Model 更改的属性
     
     
    $user = User::first();
    $user->name; // John
    $user->name = 'Peter';
    $user->save();
     
    dd($user->getChanges());
    // 输出:
    [
    'name' => 'John',
    'updated_at' => '...'
    ]
    4.9. 查询 Model 是否已更改
     
     
    $user = User::first();
    $user->name; // John
    $user->isDirty(); // false
    $user->name = 'Peter';
    $user->isDirty(); // true
    $user->getDirty(); // ['name' => 'Peter']
    $user->save();
    $user->isDirty(); // false
    getChanges() 与 getDirty() 的区别
     
    getChanges() 方法用在 save() 方法之后输出结果集
     
    getDirty() 方法用在 save() 方法之前输出结果集
     
     
     
    4.10. 查询修改前的 Model 信息
     
     
    $user = AppUser::first();
    $user->name; //John
    $user->name = "Peter"; //Peter
    $user->getOriginal('name'); //John
    $user->getOriginal(); //Original $user record
     
     
    5,大批量假数据填充的正确方法
    $users = factory(AppModelsUser::class)->times(1000)->make();
    AppModelsUser::insert($users->toArray());
     
    6,orm 使用chunk方法导致数据偏移问题的解决办法
    使用 chunkById代替
    参考 https://www.lqwang.net/13.html

    7,
    laravel 水蛇下划线转驼峰 驼峰转下划线 orm转驼峰
    use IlluminateSupportStr;
    $key = 'admin_id';
    $key = Str::camel($key);
    p($key);
    $key = Str::snake($key);
    p($key);

    8,laravel orm 使用模型使用forPage问题

    如果你是model是new出来的

    $brokerMemberData = new BrokerMemberData();
            if (!empty($page) || !empty($pageSize)) {
                $brokerMemberData = $brokerMemberData->forPage($page, $pageSize);
            }

    这样才能出现分页,如果你是

    $mcStaffPullNewTask = McStaffPullNewTask::where('is_delete', 10);
            if (!empty($page) || !empty($page_size)) {
                $mcStaffPullNewTask->forPage($page, $page_size);
            }

    就不需要接返回值

    
    
    QQ群 247823727 博客文件如果不能下载请进群下载
    如果公司项目有技术瓶颈问题,如有需要,请联系我,提供技术服务 QQ: 903464207
  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/zx-admin/p/14718423.html
Copyright © 2011-2022 走看看