php的db类库Eloquent单独使用系列(1)
php的db类库Eloquent单独使用系列(2) - 分页
php的db类库Eloquent单独使用系列(3) - sql日志
php的db类库Eloquent单独使用系列(4)- 事件监听
php的db类库Eloquent单独使用系列(5)- 模型转数组
php的db类库Eloquent单独使用系列(6)- 一对一关联
php的db类库Eloquent单独使用系列(7)- 一对多关联
php的db类库Eloquent单独使用系列(8)- 多对多关联
php的db类库Eloquent单独使用系列(9)- 多对多关联 - 表关联自身
php的db类库Eloquent单独使用系列(10)- 多对多关联 - 远程一对多
php的db类库Eloquent单独使用系列(11)- 多对多关联 - 添加模型属性
php的db类库Eloquent单独使用系列(12)- 结果集模型转数组 - 2
本系列文章的目的就是脱离laravel环境使用Eloquent,因为它 好用。
本系列文章所有代码均测试通过。Eloquent版本:5.4.27
本文的目的是彻底把laravel的结果集返回对象改成数组的问题搞定。
网上查阅好像有一种方法是改配置,可是这样的话,会影响全局,不希望如此,
所以单独写了一个查询方法,仅适用于select,并定义了很方便的4种查询方法,这样,eloquent就可以更加通用的使用在除了laravel的各种框架里!!
建表
请自行插入几条数据
CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户名称', PRIMARY KEY (`id`) )
源代码
主要两个文件,一个是DbSelect类,另外是客户端代码,注意实际使用中,肯定是把db对象的获取单独定义的。
DbSelect.php
map(function ($v,$k){ return get_object_vars($v); })->toArray() ; return $result; } /** * 获取数据库查询结果,是单列的, * 假如sql语句中包含多列,只取第一列 * 假如结果集为空,返回[] * * @param \Illuminate\Database\Capsule\Manager $db laravel5框架的Eloquent的DB对象 * @param string $sql 查询语句 * @param array $bind 绑定参数 * return array 一维数组 */ public static function fetchCol($db, $sql, $bind=[]) { $result = collect( $db::select($sql,$bind ))->map(function ($v,$k){ $a = get_object_vars($v); foreach ($a as $k2=> $v2) { return $v2; } })->toArray(); return $result; } /** * 获取数据库查询结果,是单个值,标量 * 假如sql语句中包含多列,只取第一列 * 假如结果集有多行,只取第一行 * 假如结果集为空,返回null * * @param \Illuminate\Database\Capsule\Manager $db laravel5框架的Eloquent的DB对象 * @param string $sql 查询语句 * @param array $bind 绑定参数 * return mixed 整型|字符串|浮点型 */ public static function fetchOne($db, $sql, $bind=[]) { $result = collect( $db::select($sql,$bind ))->map(function ($v,$k){ if ($k==0) { $a = get_object_vars($v); foreach ($a as $k2=> $v2) { return $v2; } } })->toArray(); if ($result) { $result = $result[0]; }else { $result = null; } return $result; } /** * 获取数据库查询结果,只取第一行 * 假如结果集为空,返回null * * @param \Illuminate\Database\Capsule\Manager $db laravel5框架的Eloquent的DB对象 * @param string $sql 查询语句 * @param array $bind 绑定参数 * return array 一维数组,对应表中的一行。 */ public static function fetchRow($db, $sql, $bind=[]) { $result = collect( $db::select( $sql,$bind ))->map(function ($v,$k){ if ($k==0){ return get_object_vars($v); }else { return null; } })->toArray() ; if ($result) { $result = $result[0]; }else { $result = null; } return $result; } }
客户端代码
addConnection ( [ 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'test1', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '' ] ); $db->setAsGlobal (); $db->bootEloquent (); $sql1 = "SELECT id,name FROM users where id<10 order by id asc limit 2";// 常规无bind $sql2 = "SELECT id,name FROM users where id<10 order by id asc limit ?";//必须带bind $sql3 = "SELECT id,name FROM users where id<0 order by id asc limit 2"; //注定无结果 echo "select - fetchAll()方法
"; $result = \app\lib\DbSelect::fetchAll($db, $sql1); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchAll($db, $sql2,[2]); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchAll($db, $sql3); var_dump($result);echo "
"; echo "select - fetchCol()方法
"; $result = \app\lib\DbSelect::fetchCol($db, $sql1); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchCol($db, $sql2,[2]); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchCol($db, $sql3); var_dump($result);echo "
"; echo "select - fetchOne()方法
"; $result = \app\lib\DbSelect::fetchOne($db, $sql1); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchOne($db, $sql2,[2]); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchOne($db, $sql3); var_dump($result);echo "
"; echo "select - fetchRow()方法
"; $result = \app\lib\DbSelect::fetchRow($db, $sql1); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchRow($db, $sql2,[2]); var_dump($result);echo "
"; $result = \app\lib\DbSelect::fetchRow($db, $sql3); var_dump($result);echo "
"; echo '
all ok!'; } }
浏览器输出