$buildingObject = Building::findAll("status=1");
这个调用看着没有任何毛病,可是在使用时返回的结果倒是一个空数组。再回过头来看看数据表中:
按照套路来说,查询后应该返回的是一个对象数组呀!为何是空呢?百思不得其解,仍是去翻看一下代码吧。数组
静态方法findAll()实际上是在yii\db\BaseActiveRecord中的:yii2
/** * @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(); }
关于他的实现实际上是调用了本方法中的findByCondition来实现的,从这儿你们也能够看到高大上的findAll($condition)的实现也是很是简单的调用了相应的方法来实现的而已。因此其实若是是查询多条数据的话也可使用其余方式都很是方便的。yii
静态方法findAll($condition)实际上是调用了findByCondition这个静态方法的那么这个方法是怎么样实现的呢?ui
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); }
这儿有个误区你们要注意了,这儿的findByCondition($condition)实际上是ActiveRecord中的而不是BaseActiveRecord,由于继承关系已经被重写。
这部分的代码也很简单,重点是在那个if判断中。spa
if (!ArrayHelper::isAssociative($condition))
这个是使用了yii2提供的数组辅助类里边的isAssociative来判断传入的$condition是否是一个关联数组。若是不是一个关联数组则会进入if里边进行执行。code
// 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.'); }
能够看出你在findAll($condition)时传入的参数不是关联数组的状况下会当作主键处理。可是当作主键处理时这儿能够是数组。好比:对象
$buildingObject = Building::findAll([18,19]);
这样查询的结果是id为18和19的两条数据的对象数组。可是若是你真的要按照id来查询多条数据的话注意了,参数中的id不能是字符串。例如blog
$buildingObject = Building::findAll("18,19");
这样查询仅仅能查出id为18的数据。固然单条数据的查询仍是推荐使用很是方便的findOne($condition)来查询。
固然若是有相等的组合条件也是能够的,例如:继承
$buildingObject = Building::findAll(['id'=>[18,19],'status'=>1]);
这样就查询出id为18和19并且status字段为1的数据ci
固然若是有表达式数组条件和字符串条件都不支持的。例如
//注意如下是错误示范 $buildingObject = Building::findAll("id>10"); $buildingObject = Building::findAll([">", "id", 10);
因此在项目中findAll要慎重使用固然使用findAll来查询的均可以用其余方法来代替。
如下属于原创
findall出来的对象是一个数组,
一种状况
$pc=Product_category::findAll(['p'=>'638']);
二种状况
// $pc=Product_category::findOne(['p'=>'636']);
// $pc->delete();
三种状况
// $pc=Product_category::findOne('284');
// $pc->delete();
二和三等价
一出来的结果要遍历,若是后面有插入那就惨了。