hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - PHP框架 - ThinkPHP - 正文 请牢记本站网址www.sosophp.cn

ThinkPHP:数据查询的基本原则【ThinkPHP教程】,ThinkPHP,数据查询,基本原则

2019-12-17ThinkPHP搜搜PHP网38°c
A+ A-

关于本文涉及到的数据查询的几个基本原则请只管归入你的项目范例,也是官方提倡的最好实践。在此之前,我愿望你已看过之前的一篇博客:「 你真的相识Db类和模子的准确运用姿态么? 」。

只管不要运用数组前提查询

大部分杂沓的查询语法都是运用了数组查询致使的,而5.1的数组前提查询用法又和5.0是完整差别的,假如你习惯了5.0的数组查询体式格局,发起你浏览下这篇文章:「 教你运用5.1的数组对象查询 」。

下面多是许多新手比较轻易犯的一个查询毛病。

$where['id'] = ['in', '1,2,3'];
User::where($where)->select();

明显,这个查询头脑深受老版本的影响。5.1版本的查询语法相比较5.0来讲,越发对象化,下面的这类才是准确的用法。

$where['id'] = [1,2,3];
User::where($where)->select();

或许是因为PHP的数组太好用的原因,许多人对数组查询前提乐此不疲(或许是对象焦炙?)。但假如你准确的运用查询组织器以及合营模子的相干特征,能够让你的查询逻辑变得更清晰,也越发易于保护。

而且,在一些较为庞杂的查询前提下,你没法运用数组完成查询,比方下面的查询用法。

User::where('id', '>', 100)
    ->whereOr('id', '<', 10)
    ->where('name', 'like', 'think%')
    ->whereColumn('name', 'nickname')
    ->when('80'== $condition, function ($query) {
        $query->where('score', '>', 80)->limit(10);
    })->select();

所以,除非你很清晰5.1的数组查询用法,不然请只管不要用数组前提查询了。

平安运用字符串查询前提

在运用字符串查询前提的时刻,假如存在外部变量,请务必运用参数绑定,并最好运用whereRaw要领,该要领能够和别的的查询组织器要领夹杂运用。

User::whereRaw("id = :id AND name = :name", [
        'id' => [$id, \PDO::PARAM_INT] , 
        'name' => $name
    ])->where('status', 1)
    ->order('id', 'desc')
    ->select();

关于一些比较在乎机能的查询,你也能够直接运用query或许execute要领,但一样也要注重参数的平安以及斟酌差别数据库的移植问题。

Db::query("select * from think_user where id=? AND status=?", [8, 1]);
Db::execute("update think_user set name=:name where status=:status", ['name' => 'thinkphp', 'status' => 1]);

对运用了SQL函数的查询采纳Raw机制

假如你的查询内里包含了SQL函数,那末请运用whereRaw(或许whereExp)、orderRaw或许fieldRaw要领。

User::whereExp('nickname', "= CONCAT(name, '-', id)")
    ->orderRaw("field(name,'thinkphp', 'kancloud')")
    ->fieldRaw('id,SUM(score)')
    ->select();

合理运用闭包,但不要滥用

闭包查询在查询组织器中有一些特别用处,但如非必要,也无需滥用。

闭包查询的典范运用场景包含下面几个。

前提查询中一般都用闭包来示意一组前提查询。

User::when($condition, function ($query) {
    // 满足前提后实行
    $query->where('score', '>', 80)->limit(10);
}, function ($query) {
    // 不满足前提实行
    $query->where('score', '>', 60);
})->select();

在一些子查询中经常会用到闭包。

User::whereIn('id', function ($query) {
    $query->table('profile')
        ->where('name', 'like', 'think%')
        ->field('id');
})->select();

生成一组闭合的查询前提

User::where('id', '>', 100)
    ->whereOr(function($query) {
        $query->where('name', 'like', 'think%')
        ->whereColumn('name', 'nickname');
    })->select();

在这个查询用法中,闭包内里的查询前提会在双方加上括号而成为一个闭合的查询前提。

在许多的关联预载入查询中能够经由过程闭包来举行关联数据的挑选。

User::with(['profile' => function($query) {
$query->field('user_id,email,phone');
}])->select([1,2,3]);

只管复用你的查询前提

一切的查询前提应当做到一处定义多处复用,比方封装到模子的要领内里,特别不要直接把一堆庞杂的查询前提写到你的控制器代码,不然一旦营业调解,满世界的搜刮代码转变你的查询前提将会是一场恶梦。

你或许在官方的手册或许一些教程中看到许多在控制器内里直接封装查询前提的写法,但那仅仅是出于轻易展现用法的须要,并不可取。

在一些中大型的运用架构设想中,一般会把模子分红数据层、逻辑层和效劳层,控制器只会挪用效劳层要领。而查询逻辑则基本上被封装到逻辑层内里,数据层仅仅是做模子的种种定义。

而在简朴的运用内里,也能够采纳PHP的Trait机制来完成代码的复用机制。

用查询局限或搜刮器简化查询

假如你运用模子查询的话,把你的查询前提只管封装到查询局限或许搜刮器要领内里,查询局限和搜刮器的区分重要在于查询局限比较合适定义一组(多个字段)查询前提,假如要挪用多个查询局限须要屡次挪用,而搜刮器比较合适定义一个字段(实在并不是相对)的查询前提,只须要挪用一次withSearch要领。

运用查询局限和搜刮器的例子。

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function scopeVip($query)
    {
        $query->where('user_type', 'vip')
            ->where('status', 1)
            ->field('id,name');
    }
    
    public function searchAgeAttr($query, $age)
    {
        $query->where('age','>',$age);
    }    
    
    public function searchScoreAttr($query, $score)
    {
        $query->where('score','<=',$score)->where('score', '>' ,0);
    }    
}

控制器代码

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class index extends Controller
{
    public function index(Request $request)
    {
        // 查询VIP会员
        User::vip()->select();
        // 查询岁数和分数
        User::withSearch(['age,'score''], $request->param())->select();
    }
}

在控制器代码中,我们只关注营业逻辑自身,而不须要关注这个逻辑内部的查询前提是什么。更细致的关于搜刮器和查询局限的内容能够参考官方手册。

ki4网,有大批免费的ThinkPHP入门教程,迎接人人进修!

本文转自:https://blog.thinkki4.cn/833794

以上就是ThinkPHP:数据查询的基本原则的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
ThinkPHP:数据查询的基本原则【ThinkPHP教程】,ThinkPHP,数据查询,基本原则

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章