今天主要来看Magento中的Mysql4/Resource(资源) 如何对数据库进行操作, 来执行更为复杂的 sql 语句。 在Magento中Model 通常都会继承 Mage_Core_Model_Abstract, 而这个 Abstract 又继承了Varien_Object, 在 Abstract 类中包含许多常用的方法,例如: getId(), load(), save(), delete() 等等…而 Mysql4/Resource Model 则继承 Mage_Core_Model_Mysql4_Abstract, 而这个 Abstract 又继承了 Mage_Core_Model_Resource_Abstract

SQL 和 Mysql4 Resource 文件

Mysql4/Resource(资源) 文件, 用来和数据库中的表打交道,执行各类的数据库查询,在下面我会展示如何在 Resource(资源) 文件中进行 SQL 语句操作。

SELECT 操作

在这里,我就用 Test 模块中的 Mysql4/Resource 文件来举例。

PATH:  Excellence/Test/Model/Mysql4/Test.phpclass Excellence_Test_Model_Mysql4_Test extends Mage_Core_Model_Mysql4_Abstract
{public function _construct(){   $this->_init('test/test', 'test_id');}public function loadByField($field, $value){$table  = $this->getMainTable();$where  = $this->_getReadAdapter()->quoteInto("$field = ?", $value);$select = $this->_getReadAdapter()->select()->from($table, array('test_id'))->where($where);$item   = $this->_getReadAdapter()->fetchOne($sql);return $item;}
}

这是我们的 Model 文件, Excellence/Test/Model/Test.php

class Excellence_Test_Model_Test extends Mage_Core_Model_Abstract
{public function _construct(){parent::_construct();$this->_init('test/test');}public function loadByField($field, $value){$id = $this->getResource()->loadByField($field, $value);$this->load($id);}
}

我们一个一个的来了解,首先,我们用到了这个方法

$id = $this->getResource()->loadByField($field, $value);

这个方法 $this->getResource() 会返回出一个资源(Resource)模型类, 这样我们就可以很方便的在资源模型类里调用 loadyByField($field, $value)

getTable() 方法

在 我们的 Mysql4 文件里,方法 loadByField() 调用了 $table = $this->getMainTable(); 这个方法会返回出当前 Model 所对应的表名。 这个方法定义在其父类中, 如果你想进行连表查询或想获得另外一个表, 你可以这样操作:

$table = $this->getTable('newsletter/subscribe');

_getReadAdapter() 方法

现 在我们来看下这句: $where = $this->_getReadAdapter()->quoteInto(“$field = ?”, $value); 第一个方法是 $this->_getReadAdapter(), 该方法返回出一个对象,其包含许多方法可以用来执行数据库操作 在 Read 适配器(Adapter)里, 我们可以用到以下方法:

#1、 fetchAll()
//单次 select 查询 - 以多维数组形式返回出数据表中的所有数据
//例: 'select * from `table_name`', 用该方法来获取所有数据#2、 fetchRow()
//单次 select 查询 - 返回数据表中的一行数据
//例: "select * from `table` where `id` = ’1′", 用该方法来获取单条数据#3、 fetchCol()
//单次 select 查询 - 返回数据表中的一列数据
//例: "select `name` from `table`", 用该方法来获取单条数据#4、 fetchOne()
//单次 select 查询 - 返回数据表中单一的值
//例: "select count(*) from `table`", 我们就会用到该方法来获取单条数据$result = $this->_getReadAdapter()->fetchOne('SELECT `user` FROM `table` WHERE `user` = :greatman',array('greatman' => 'shawn'));echo "$result";

在 Read 适配器中还有很多其他方法,可以仔细去了解下

quoteInto($text, $value) 方法

另一个常用的就是 quoteInto(), 这个方法就是用来创建我们的 WHERE 语句, 在执行该方法时,真正的值会把问号替换掉,语法书写格式如下:

//"user_id = 3″
$this->_getReadAdapter()->quoteInto("user_id = ?", 3);//"field in (1,2,3)"
$this->_getReadAdapter()->quoteInto("$field IN(?)", array(1,2,3));//如果含有多个 WHERE 的时候
$this->_getReadAdapter()->quoteInto("$field = ? AND ", $value).$this->_getReadAdapter()->quoteInto("$field1 = ? OR ", $value1).$this->_getReadAdapter()->quoteInto("$field2 = ?", $value2);

我们继续来说 loadByField() 方法, 接下来着重要说的就是:

$select = $this->_getReadAdapter()->select()->from($table, array('test_id'))->where($where);

我们通过调用 select() 方法来获得到 select 对象,同时创建 select 查询, 然后它继续调用了 from() 方法

from($name, $cols = ‘*’, $schema = null) 方法

from() 这个方法带有多个参数,如果你只想执行 “select * from ” 语句, 你可以只填写第一个参数 from($table) 如果你想选择一列 test_id, 那么第二个参数就有用了, 同样的,如果想选择多列, 方法如下:

//单列 "select `test_id` from $table"
from($table, array('test_id'));//多列 "select `test_id`, `col1`, `col2` from $table"
from($table, array('test_id', 'col1', 'col2'));//多列带AS "select `test_id` as id, `col1` as column1 from $table"
from($table,array('id'=>'test_id', 'column1'=>'col1'));

还有,如果你想要输出自己刚写的 sql 语句,可以直接输出句柄

echo $select;

select 对象

select() 方法返回出一个 select 对象,该对象为我们提供了很多方法来执行 sql 语句, 其父类便是 Varien_Db_Select, 你可以在其类中找到更多的方法来更深一步的操作, 现在我们来看一个简单的php代码

public function getAll()
{$table  = $this->getMainTable();$where  = $this->_getReadAdapter()->quoteInto("id = ?", 123);$select = $this->_getReadAdapter()->select()->from($table)->columns(array('test_id'))->where($where)->limit(10,5)->order('created_time')->group('list_id')->having('list_id > ?', 10);    echo $select;
}

从上你可以看出,这些方法都是来自于 select 对象, 并且都返回出自己所在的对象,这样的操作可以便于我们把多个方法串在一起。 现在让我们来逐个温习:

#1、 select()
//用来初始化 sql 语句操作, 返回出一个 select 对象, 基于这个对象,我们可以做更多的操作#2、 from($name, $cols = '*', $schema = null)
//用来选择数据表的名字, 此时 select 已经初始化完成#3、 columns($cols = '*', $correlationName = null)
//通过这个方法你可以指定列名#4、 where($cond, $value = null, $type = null)
//用来声明 where 语句#5、 limit($count = null, $offset = null)
//第一个参数代表想要返回多少条数据, 第二个参数代表 offset 偏移量
//在上面代码中就是: LIMIT 10 OFFSET 5, 而不是 LIMIT 10,5#6、 order($spec)
//用来排序你所得的结果, 默认是: ascending
//如果想要是 descending, 可以写成 order(array('created_time' => Zend_Db_Select::SQL_DESC))#7、 group($spec)
//相当于 group by 语句#8、 having($cond, $value = null, $type = null)
//用来对 group by 语句的一个补充

Joins 方法

public function joinUs()
{$table  = $this->getMainTable();$table2 = $this->getTable('customer/entity');$cond   = $this->_getReadAdapter()->quoteInto('t1.id = t2.customer_id','');$where  = $this->_getReadAdapter()->quoteInto('t1.list_id = ?', '123');$select = $this->_getReadAdapter()->select()->from(array('t1'=>$table))->join(array('t2'=>$table2), $cond)->where($where);echo $select . "<br>";$select = $this->_getReadAdapter()->select()->from(array('t1'=>$table))->joinLeft(array('t2'=>$table2), $cond)->where($where);echo $select . "<br>";$select = $this->_getReadAdapter()->select()->from(array('t1'=>$table))->joinRight(array('t2'=>$table2), $cond)->where($where);echo $select . "<br>";
}

这是我输出所得的结果:

SELECT `t1`.*, `t2`.* FROM `szh` AS `t1`
INNER JOIN `customer_entity` AS `t2`
ON t1.id = t2.customer_id
WHERE (t1.list_id = '123')SELECT `t1`.*, `t2`.* FROM `szh` AS `t1`
LEFT JOIN `customer_entity` AS `t2`
ON t1.id = t2.customer_id
WHERE (t1.list_id = '123')SELECT `t1`.*, `t2`.* FROM `szh` AS `t1`
RIGHT JOIN `customer_entity` AS `t2`
ON t1.id = t2.customer_id
WHERE (t1.list_id = '123')

相信如何使用 Joins 已经十分清晰了, 如果你想使用 joinCross, joinFull, joinNatural 等, 你可以自己动手仔细的看下 Varien_Db_Select 类。

COUNT,MAX 方法

继续来看一个简单的方法

public function countUs()
{$table  = $this->getMainTable();$where  = $this->_getReadAdapter()->quoteInto("id = ?", 123);$select = $this->_getReadAdapter()->select()->from($table)->reset('columns')->columns(new Zend_Db_Expr('count(*)'));echo $select . '<br>';$select = $this->_getReadAdapter()->select()->from($table)->reset('columns')->columns(new Zend_Db_Expr('max(list_id)'));echo $select . '<br>';
}

所得的结果:

SELECT count(*) FROM `szh`
SELECT max("list_id") FROM `szh`

这里可以看出, 包括平均值等, 我们都可以采用 Zend_Db_Expr 类。

query() 方法

如果你有一个十分复杂的 sql 语句, 你也可以直接使用 query() 方法来执行

$sql = '...复杂的 sql 语句...';
$this->_getReadAdapter()->query($sql);

UPDATE 和 DELETE 方法

public function updateUs()
{$table = $this->getMainTable();$where = $this->_getWriteAdapter()->quoteInto('id = ?', 1);$query = $this->_getWriteAdapter()->update($table, array('product_id' => 2, 'file_id' => 3),$where);
}

这里你可以看出如何来执行 Update(更新) 语句:

UPDATE `szh` SET `product_id` = 2, `file_id` = 3 WHERE (id = 1)

至于 Delete(删除) 语句, 如下:

$this->_getWriteAdapter()->delete($table, $where)->limit(1);

P.S 你可以在其他文件,如: model, phtml等获得到 Read Adapter(适配器), 但为了更好的体现出你代码的规整性及效率, 建议在 Resource 文件里执行这些 sql 语句

原文: http://blog.wangjunfeng.com/archives/569

转自:  Magento模块开发之数据库SQL操作方法说明

Magento模块开发之数据库SQL操作方法说明相关推荐

  1. 【转】Android开发之数据库SQL

    android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 android中采用的数据库是SQLi ...

  2. 项目开发常用数据库SQL语句:通用SQL、MySQL、SQLServer、MyBatis

    目录 数据库操作 1.完整数据库备份: 2.数据库还原: 3.新建数据库表 SQL语句 1.通用SQL (1)like 模糊查询,  in (2)sql拼接 (3)数据库表 存储m³ 2.MySQL ...

  3. Magento 2开发教程 - 创建新模块

    视频在youtube网站国内访问不了,可以使用翻墙软件查看. 视频地址:www.youtube.com/embed/682p52tFcmY@autoplay=1 下面是视频文字介绍: Magento ...

  4. oracle表结构修改回滚,87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚...

    87.Oracle数据库SQL开发之 修改表内存--数据库事务的提交和回滚 数据库事务(transaction)就是一组SQL语句,这组SQL语句时一个逻辑工作单元. 要永久性的记录事务中SQL语句的 ...

  5. Visual Studio 2019连接自动的Sql Server开发版数据库(C#语言)

    Visual Studio 2019连接自动的Sql Server开发版数据库,C#语言 连接字符串: server=(LocalDB)\MSSQLLocalDB;database=master;in ...

  6. 线性回归中oracle性质,66.Oracle数据库SQL开发之 高级查询——使用线性回归函数...

    66.Oracle数据库SQL开发之 高级查询--使用线性回归函数 线性回归函数可以用普通最小平方回归曲线拟合一组数值对.线性回归函数可用于聚合.串口或报表函数. 如下图1: 例如: store@PD ...

  7. Mysql数据库设计规范之三数据库SQL开发规范

    5数据库SQL开发规范 1建议使用预编译语句进行数据库操作 只要传参数,比传递sql语句更加高效 相同语句可以一次解析,多次使用,提高处理效率 防范sql注入 2避免数据类型的隐式转换 隐式转换会导致 ...

  8. cesium 风向数据_风向标; 针对“实时”生产数据SQL Server开发/测试数据库克隆

    cesium 风向数据 介绍 (Introduction) Today, with DevOps, the need for database cloning is urgent. The devel ...

  9. php magento 开发,magento 2模块开发实例helloworld模块 hello world 程序 c语言hello world代码 c语言hello worl...

    data-id="1190000005008433" data-license="cc"> 1.在app/etc/config.php中添加自定义的模块( ...

最新文章

  1. c# IO线程 打造 定时打开指定程序
  2. 推荐一位Python终生学习者!本科期间用Python赚了10w+!
  3. OpenCV 4.5.2 发布
  4. [AlwaysOn Availability Groups]排查:Primary上的修改无法在Secondary体现
  5. python获取工程根目录_【Python】获取当前项目根路径/目录
  6. 高维数据使用npy格式保存
  7. 微软官方windows phone开发视频教程第二天视频(附下载地址)
  8. leetcode 557. Reverse Words in a String III 、151. Reverse Words in a String
  9. android l 电池,DIY新技能--M1L换电池
  10. 数组常用方法:是否改变原数组
  11. 给apk去签名、重新签名
  12. Git 修改commit提交信息
  13. 正在励志奋斗的人十大特征
  14. python爬wos数据库,分布式爬虫困惑,如何合理安排抓取/解析/储存?
  15. 知识问答领域方法概述
  16. 镁光ssd管理工具 linux,SandForce主控固态硬盘SF-2241 vb2开卡成功经验
  17. matlab khatri rao积,关于矩阵Khatri-Rao积的一些迹不等式
  18. Web页面性能优化以及SEO
  19. B.FRIENDit壁虎忍者RF1430K无线键盘鼠标套装 静音超薄键盘 台式电脑笔记本外接巧克力键盘鼠标套装银白色
  20. ExoPlayer的使用介绍

热门文章

  1. 棋盘游戏(HDU-1281)
  2. Biorhythms(POJ-1006)
  3. 动态规划 —— 背包问题 P07 —— 有依赖背包
  4. 猜数字(HDU-2178)
  5. 菲波那契数(信息学奥赛一本通-T1071)
  6. 字符串转换到double数组
  7. C++:VS2019调试dump文件
  8. pytorch1.7教程实验——对抗示例生成FGSM
  9. 中序线索树和后序线索树
  10. js多种方法:返回上一页