文档章节

Yii2中findAll()的正确使用姿势/返回为空的处理办法

d
 dragon_tech
发布于 06/23 18:10
字数 1061
阅读 8
收藏 0
点赞 0
评论 0
Yii

从一次错误的操作开始

$buildingObject = Building::findAll("status=1");
  • 1

这个调用看着没有任何毛病,但是在使用时返回的结果却是一个空数组。再回过头来看看数据表中: 
数据表
按照套路来讲,查询后应该返回的是一个对象数组呀!为什么是空呢?百思不得其解,还是去翻看一下代码吧。

抽丝剥茧从findAll开始

静态方法findAll()其实是在yii\db\BaseActiveRecord中的:

/**
 * @inheritdoc
 * @return static[] an array of ActiveRecord instances, or an empty array if nothing matches.
 */
public static function findAll($condition)
{
   return static::findByCondition($condition)->all();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

关于他的实现其实是调用了本方法中的findByCondition来实现的,从这儿大家也可以看到高大上的findAll($condition)的实现也是非常简单的调用了相应的方法来实现的而已。所以其实如果是查询多条数据的话也可以使用其他方式都非常方便的。

抽丝剥茧findByCondition($condition)

静态方法findAll($condition)其实是调用了findByCondition这个静态方法的那么这个方法是怎么样实现的呢?

protected static function findByCondition($condition)
{
    $query = static::find();

    if (!ArrayHelper::isAssociative($condition)) {
        // query by primary key
        $primaryKey = static::primaryKey();
        if (isset($primaryKey[0])) {
            $pk = $primaryKey[0];
            if (!empty($query->join) || !empty($query->joinWith)) {
                $pk = static::tableName() . '.' . $pk;
            }
            $condition = [$pk => $condition];
        } else {
            throw new InvalidConfigException('"' . get_called_class() . '" must have a primary key.');
        }
    }

    return $query->andWhere($condition);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

这儿有个误区大家要注意了,这儿的findByCondition($condition)其实是ActiveRecord中的而不是BaseActiveRecord,因为继承关系已经被重写。 
这部分的代码也很简单,重点是在那个if判断中。

if (!ArrayHelper::isAssociative($condition))
  • 1

这个是使用了yii2提供的数组辅助类里边的isAssociative来判断传入的$condition是不是一个关联数组。如果不是一个关联数组则会进入if里边进行执行。

// query by primary key
$primaryKey = static::primaryKey();   //获取数据表的主键
if (isset($primaryKey[0])) {    //判断主键是否为空
    $pk = $primaryKey[0];
    //判断有没有连表查询,如果有连表查询就处理成  表名.主键   的方式
    if (!empty($query->join) || !empty($query->joinWith)) {
        $pk = static::tableName() . '.' . $pk;
    }
    //直接把条件当做主键拼接到条件了!!!
    $condition = [$pk => $condition];
} else {
    //如果主键为空则抛出异常
    throw new InvalidConfigException('"' . get_called_class() . '" must have a primary key.');
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

常用用法分析

可以看出你在findAll($condition)时传入的参数不是关联数组的情况下会当做主键处理。但是当做主键处理时这儿可以是数组。比如:

$buildingObject = Building::findAll([18,19]);
  • 1

这样查询的结果是id为18和19的两条数据的对象数组。但是如果你真的要按照id来查询多条数据的话注意了,参数中的id不能是字符串。例如

$buildingObject = Building::findAll("18,19");
  • 1

这样查询仅仅能查出id为18的数据。当然单条数据的查询还是推荐使用非常方便的findOne($condition)来查询。 
当然如果有相等的组合条件也是可以的,例如:

$buildingObject = Building::findAll(['id'=>[18,19],'status'=>1]);
  • 1

这样就查询出id为18和19而且status字段为1的数据

错误示范

当然如果有表达式数组条件和字符串条件都不支持的。例如

//注意以下是错误示范
$buildingObject = Building::findAll("id>10");
$buildingObject = Building::findAll([">", "id", 10);
  • 1
  • 2
  • 3

所以在项目中findAll要慎重使用当然使用findAll来查询的都可以用其他方法来代替。

 

 

以下属于原创

findall出来的对象是一个数组,

一种情况 

$pc=Product_category::findAll(['p'=>'638']);

二种情况

        // $pc=Product_category::findOne(['p'=>'636']);

        // $pc->delete();

三种情况

       // $pc=Product_category::findOne('284');

        // $pc->delete();

        二和三等价

一出来的结果要遍历,如果后面有插入那就惨了。

本文转载自:https://blog.csdn.net/marswill/article/details/73850225

共有 人打赏支持
d
粉丝 2
博文 114
码字总数 3639
作品 0
西安
YII访问数据库(Yii Dao)

CDbConnection: 一个抽象数据库连接 CDbCommand: SQL statement CDbDataReader: 匹配结果集的一行记录 CDbTransaction:数据库事务 访问数据库前需要建立数据库连接;使用DAO建立一个抽象数据...

rooney
2014/08/15
0
0
Yii框架多表查询(一对一与多对一)

在网上查过了很多yii框架多表查询的问题,但总没有适合自己的,自己建了几张表过来分析,把操作写出来分享Yii框架多表查询(一对一与多对一)给大家 查一对一或多对一(常使用到的就是文章和文章分...

李佳顺
2014/04/10
0
0
【翻译】Yii2 第2章 用Yii2创建自定义应用(第2部分)

将Yii框架引入我们的应用 现在,我们拥有了可以工作的全套基础设施,让我们回到在设计阶段时定义的第一个特性,让我们先为它写一个验收测试。 第一个端到端测试 端到端验收测试的要点就是,我...

zcgly
2015/09/29
383
0
Yii 2 —— 密码加密算法

1.1 密码加密算法 参考文档: 1、更新后的 PHP: 现代 PHP 中的密码安全性; 2、http://php.net/manual/zh/function.password-hash.php 3、http://php.net/manual/zh/function.password-veri......

tywali
06/29
0
0
yii2 restful 风格搭建(二)接口认证

做完了基本的 restful 搭建,就需要接口认证和定义返回码了 一、yii2 支持的 3种认证方式 1、HTTP 基本认证: yiifiltersauthHttpBasicAuth 支持两种认证方式,输入用户名和密码和只输入用户名...

botkenni
05/03
0
0
小紫羽/yii2-fast-api

yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发。 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用restfull的标准,方便...

小紫羽
2017/01/20
0
0
Yii框架操作AR-Query篇

Yii框架操作AR-Query篇 数据库表Table: 数据查询Query: 查询一条数据 find(mixed $condition='', array $params=array ( )) eg. Id = 3 手册写法: $manage = Manage::model()->find("id=:id......

Hui-Lee
2013/07/12
0
0
当Yii遇上不支持pdo_mysql的服务器

(2014-10-9,在使用过程中仍发现不少问题,已迁移至https://github.com/xiilei/php-functions/tree/master/yii,不定期维护,下列代码不再更新) 这真是一件很郁闷的事情,项目的一个子项目(cm...

xilei
2014/03/28
0
2
Yii CDbCriteria 常用方法

Yii CDbCriteria 常用方法 注:$c = new CDbCriteria();是ActiveRecord的一种写法,使ActiveRecord更加灵活,而不是手册中DAO(PDO)和Query Builder。 这是Yii CDbCriteria的一些笔记和常用...

Neo_
2013/10/03
0
0
yii2源码分析之执行基本流程

用yii2框架用了将近2年,一直都没有去看过它底层源码, 马上快不用了,最近对其源码研究一番,哈哈 废话少说,上代码, 入口文件是web/index.php

china_lx1
04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ClassNotFoundException: javax.el.ELManager

这个是因为tomcat7中的el-api2.2,有些版本太低,建议升级tomcat到8.0,利用el-api3.0就会解决这个问题。

无语年华
5分钟前
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
17分钟前
0
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
18分钟前
0
0
Kafka相关使用

安装前提,需要有jdk环境,还有zookeeper环境 zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/ zookeeper安装参考:https://www.jianshu.com/p/f7037105db46 kafka的下......

朝如青丝暮成雪
19分钟前
0
0
CentOS7 解决无法使用tab自动补全 tab代码提示

一、前言 对于刚刚开始学习linux的新人来说,linux的一切都显着神秘,只能惊叹于大牛在Linux上行云流水的操作。今天介绍一下在linux中自动补全的功能。 对于新人来说,在不懂得技巧的情况下,...

ziluopao
25分钟前
0
0
redis安装

https://www.cnblogs.com/feijl/p/6879929.html

ghou-靠墙哭
25分钟前
0
0
Spring核心——注解自动装载

从配置上扩展 之前的文章介绍了Spring的IoC容器配置管理方面的详细内容,需要了解的可以从IoC容器的设计模式开始阅读。在介绍基于注解配置的配置之前我们再重复一下在之前提到的基本认识: ...

随风溜达的向日葵
28分钟前
2
0
ElasticSearch学习(8)—— SearchType

Elasticsearch有四种类型的SearchType 1、query and fetch 向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最...

叶枫啦啦
30分钟前
0
0
MYSQL备份工具-mysqldump

介绍 mysqldump 是文本备份还是二进制备份 它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象。它也有 insert 语句来使用数据构成表。 语法 mysqldump 的语法是...

郭恩洲_OSC博客
31分钟前
0
0
我的第一个go web框架

使用了beego等go web开发框架之后,感觉各种不方便,尤其是在接收参数、和自定义输出的时候,各种难受,定义各种model,这不是找事情嘛??尤其是在角色权限控制的时候我也感觉力不从心。。。...

独坐苔痕但观罗敷
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部