laravel wherehas 处理数据_Laravel 最佳实践_致力于的博客-CSDN博客

单一职责原则
不要这样做:

public function getFullNameAttribute()
{
    if (auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified()) {
        return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
    } else {
        return $this->first_name[0] . '. ' . $this->last_name;
    }
}
这样做比较好:

public function getFullNameAttribute()
{
    return $this->isVerifiedClient() ? $this->getFullNameLong() : $this->getFullNameShort();
}
 
public function isVerifiedClient()
{
    return auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified();
}
 
public function getFullNameLong()
{
    return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
}
 
public function getFullNameShort()
{
    return $this->first_name[0] . '. ' . $this->last_name;
}
数据库相关的逻辑代码写到模型或者 Repository 里面
不要这样做:

public function index()
{
    $clients = Client::verified()
        ->with(['orders' => function ($q) {
            $q->where('created_at', '>', Carbon::today()->subWeek());
        }])
        ->get();
 
    return view('index', ['clients' => $clients]);
}
这样做比较好:

public function index()
{
    return view('index', ['clients' => $this->client->getWithNewOrders()]);
}
 
class Client extends Model
{
    public function getWithNewOrders()
    {
        return $this->verified()
            ->with(['orders' => function ($q) {
                $q->where('created_at', '>', Carbon::today()->subWeek());
            }])
            ->get();
    }
}
将验证逻辑从控制器转移到 Request 类里面
不要这样做:

public function store(Request $request)
{
    $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
        'publish_at' => 'nullable|date',
    ]);
 
    // ....
}
这样做比较好:

public function store(PostRequest $request)
{    
    // ....
}
 
class PostRequest extends Request
{
    public function rules()
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
            'publish_at' => 'nullable|date',
        ];
    }
}
业务逻辑应当写在 service 类里面
不要这样做:

public function store(Request $request)
{
    if ($request->hasFile('image')) {
        $request->file('image')->move(public_path('images') . 'temp');
    }
 
    // ....
}
这样做比较好:

public function store(Request $request)
{
    $this->articleService->handleUploadedImage($request->file('image'));
 
    // ....
}
 
class ArticleService
{
    public function handleUploadedImage($image)
    {
        if (!is_null($image)) {
            $image->move(public_path('images') . 'temp');
        }
    }
}
不要写重复代码
不要这样做:

public function getActive()
{
    return $this->where('verified', 1)->whereNotNull('deleted_at')->get();
}
 
public function getArticles()
{
    return $this->whereHas('user', function ($q) {
            $q->where('verified', 1)->whereNotNull('deleted_at');
        })->get();
}
这样做比较好:

public function scopeActive($q)
{
    return $q->where('verified', 1)->whereNotNull('deleted_at');
}
 
public function getActive()
{
    return $this->active()->get();
}
 
public function getArticles()
{
    return $this->whereHas('user', function ($q) {
            $q->active();
        })->get();
}
尽量选择用模型而不是 Query Builder 和原生 SQL 查询,尽量用集合而不是数组
不要这样做:

SELECT *
FROM `articles`
WHERE EXISTS (SELECT *
              FROM `users`
              WHERE `articles`.`user_id` = `users`.`id`
              AND EXISTS (SELECT *
                          FROM `profiles`
                          WHERE `profiles`.`user_id` = `users`.`id`) 
              AND `users`.`deleted_at` IS NULL)
AND `verified` = '1'
AND `active` = '1'
ORDER BY `created_at` DESC
这样做比较好:

Article::has('user.profile')->verified()->latest()->get();
批量赋值
不要这样做:

$article = new Article;
$article->title = $request->title;
$article->content = $request->content;
$article->verified = $request->verified;
 
$article->category_id = $category->id;
$article->save();
这样做比较好:

$category->article()->create($request->validated());
避免 N+1 问题,使用延迟加载
不要这样做:

@foreach (User::all() as $user)
    {{ $user->profile->name }}
@endforeach
这样做比较好:

$users = User::with('profile')->get();
 
...
 
@foreach ($users as $user)
    {{ $user->profile->name }}
@endforeach
变量和方法命名要见名知意
不要这样做:

if (count((array) $builder->getQuery()->joins) > 0)
这样做比较好:

// 判断是否有人加入
if (count((array) $builder->getQuery()->joins) > 0)
这样做更好:

if ($this->hasJoins())
模板里不要写 js,css 代码,前端任何代码不要写在 php 类文件里面
不要这样做:

let article = `{{ json_encode($article) }}`;
这样做比较好:

<input id="article" type="hidden" value='@json($article)'>
 
或者
 
<button class="js-fav-article" data-article='@json($article)'>{{ $article->name }}<button>
js 文件:

let article = $('#article').val();
最好的办法是用特定的 php 到 js 包去传输数据。

使用配置、语言文件、常量代替代码中的文本
不要这样做:

public function isNormal()
{
    return $article->type === 'normal';
}
 
return back()->with('message', 'Your article has been added!');
这样做比较好:

public function isNormal()
{
    return $article->type === Article::TYPE_NORMAL;
}
 
return back()->with('message', __('app.article_added'));
使用标准 Laravel 工具,尽量不要使用第三方的

遵循 Laravel 命名约定
遵循 PSR 2.

写更简短、更易读的代码
不要这样做:

$request->session()->get('cart');
$request->input('name');
这样做比较好:

session('cart');
$request->name;
更多例子

使用 IoC 容器或者 Facade 替代 new 创建新类
不要这样做:

$user = new User;
$user->create($request->validated());
这样做比较好:

public function __construct(User $user)
{
    $this->user = $user;
}
 
// ....
 
$this->user->create($request->validated());
用 config() 取配置信息,而不是用 env()
不要这样做:

$apiKey = env('API_KEY');
这样做比较好:

// config/api.php
'key' => env('API_KEY'),
 
// 使用如下:
$apiKey = config('api.key');
使用 accessors 和 mutators 修改日期格式
不要这样做:

{{ Carbon::createFromFormat('Y-d-m H-i', $object->ordered_at)->toDateString() }}
{{ Carbon::createFromFormat('Y-d-m H-i', $object->ordered_at)->format('m-d') }}
这样做比较好:

// 模型
protected $dates = ['ordered_at', 'created_at', 'updated_at'];
public function getSomeDateAttribute($date)
{
    return $date->format('m-d');
}
 
// 视图
{{ $object->ordered_at->toDateString() }}
{{ $object->ordered_at->some_date }}
其他
永远不要在路由文件里面写逻辑。

最好不要在模板文件里面写原始 php 代码。
————————————————
版权声明:本文为CSDN博主「致力于」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_29432421/article/details/112075076

php代码应该这样写相关推荐

  1. 代码要想写得好,品位必须提一提!

    要写出好代码,首先需要提升品位. 很多软件工程师写不好代码,在评审他人的代码时也看不出问题,就是因为缺乏对好代码标准的认识. 现在还有太多的软件工程师认为,代码只要可以正确执行就可以了.这是一种非常低 ...

  2. python游戏最简单代码-用python写游戏脚本原来这么简单

    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西. 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成.游戏脚本其实并 ...

  3. 代写SOFTENG 370 Operating Systems课设、代做C/C++ 留学生作业、代写c/c++代码、代写C/C++编程作业...

    代写SOFTENG 370 Operating Systems课设.代做C/C++ 留学生作业.代写c/c++代码.代写C/C++编程作业 SOFTENG 370 Operating Systems ...

  4. Leetcode惊现马化腾每天刷题?为啥大佬都这么努力?代码你打算写到几岁?

    前几天,一张未证真伪的截图流传,图中显示马化腾几乎每天都会在 Leetcode 上提交代码. 截图还贴出一个 Leetcode 账户地址.该地址的头像已从马化腾的照片换成腾讯 logo,昵称也从&qu ...

  5. 这个代码应该怎么写???

    这个代码应该怎么写??? Delphi / Windows SDK/API http://www.delphi2007.net/DelphiDB/html/delphi_200612221513091 ...

  6. 高质量的工程代码为什么难写

    之所以想起写这篇文章,是因为最近看到的一个著名的开源项目在内部使用时的各种问题,不得不说,很多的开源的东西思想是不错的,但离真正工程化都有不小的距离,所以没什么商业公司采用的开源产品如果要引入的话一定 ...

  7. python爬虫都能干什么用_5 行代码就能写一个 Python 爬虫

    欢迎关注我的公众号:第2大脑,或者博客:高级农民工,阅读体验更好. 摘要:5 行代码就能写一个 Python 爬虫. 如果你是比较早关注我的话,会发现我此前的大部分文章都是在写 Python 爬虫,前 ...

  8. 华为java一个月写多少行代码_[财经]阿里员工吐槽华为:面试官1万行代码都没写过? - 南方财富网...

    5月7日,有疑似阿里员工在社交网络上爆料称,打算跳槽华为,但是去面试后,真的是太失望,因为面试官真的是太水了. 从这位网友晒出的帖子看,一名阿里的员工面试华为云后端开发的岗位,但过程并不顺利,因为面试 ...

  9. 深度学习研究生如何快速提升代码能力,写出高效的代码?

    深度学习代码与前端代码区别 深度学习的代码能力与开发后台或者前端的工程代码能力不是一个概念. 写前端代码:脑海中是整个工程的架构,写代码则是把这些架构用 code 具体化. 写深度学习代码:脑海中浮现 ...

  10. 【低代码】手写低代码中的编译器/翻译器

    编译器.解释器 相信计算机的同学对这两个词一定不陌生,从学计算机开始,我们就知道了计算机是二进制的世界,而我们用高级语言编写的代码计算机是无法理解的,编译器就是将我们编写的代码编译成计算机可以执行的二 ...

最新文章

  1. Gazebo构建小车模型并通过ROS控制
  2. python画七边形的角度_python之turtle模块-生化危机
  3. 瑞星08试用版到期了,下面装个什么杀毒软件比较好呢?
  4. python3spark文本分类_如何用Spark深度集成Tensorflow实现文本分类?
  5. 二叉树题目----5 平衡二叉树 AND 根据二叉树创建字符串
  6. h5文字垂直居中_CSS居中的常用方式以及优缺点
  7. WPS-批量把数字转换成文本格式
  8. php获取qq头像和昵称,通过接口获取QQ头像和昵称
  9. [linux内核] 3.系统调用处理过程
  10. 如何安装linux系统步骤
  11. 谈一谈手游的运营与推广的那些事儿!
  12. 开机后黑屏看不到桌面_开机不显示桌面黑屏怎么办_win10开机黑屏啥也没有的解决办法...
  13. Hadoop Failover
  14. 古希腊数学家把数1,3,6,10,15,21,...叫做三角形数,它有一定的规律性。若把第一个三角形数记为a1,第二个三角形数记为a2,...,第n个三角形数记为an,计算a1+a2,a2+a3
  15. [集中式] SVN的安装与详细使用教程
  16. 大数问题:大数加法 与 大数乘法 最简单大数乘法
  17. (入门级web应用)小书签收集站开发日志(一)--项目规划及最基本功能实现
  18. 计蒜客 2018南京网络赛 I Skr(马拉车+哈希)
  19. 工程流体力学笔记暂记15(理想流体的运动微分方程)
  20. 新手C语言实现判定三角形及其面积运算

热门文章

  1. HTML中引入CSS方法
  2. 章节五:RASA NLU组件介绍--语言模型和分词器
  3. Python吊打Excel?7年Excel的数据分析师不服
  4. 《数据库应用系统实践》------ 酒店客房管理系统
  5. 云商城类似于淘宝商城系统源码+附教程
  6. word转pdf (Centors环境下)
  7. linux管理用户和组实验报告,LINUX实验:用户与用户组管理
  8. cad立面索引符号 规范_cad剖面符号和索引符号该怎么画?
  9. 软考-软件设计师 笔记十(软件工程)
  10. numpy安装出错等一系列问题