CAKEPHPFIND
书写复杂的条件语句
$constraints(约束)参数中最简单的conditions(条件)键有如下结构:
'conditions' => array(
"模型名称.字段名称" =>
"比较运算符 值"
)这个结构的好处就是我们可以使用二元运算符对它进行扩展,以便让其支持多个条件。接下来让我们会快速通过几个例子来学习不同状况下'conditions'键的使用方法。我们也将通过这些例子弄清楚如何通过使用字段间不同的二元操作符来实现多条件查询:
1,如果我们想找一个ISBN书号为'1234567890'的书,我们只需执行如下SQL命令:
SELECT * FROM `books` AS `Book` WHERE `Book`.`isbn` = '1234567890';
但是在CakePHP的在BooksController中,我们可以像下面这样调用find()方法:
$this->Book->find('first',array(
'conditions' => array(
'Book.isbn' => '= 1234567890'
)
)
);这里使用的”=”(等于)运算符可以去掉。CakePHP在没有找到比较运算符时会默认使用“=“运算符
2,如果我们想查找书名中包含有“CakePHP”一词的书,我们可以执行如下SQL代码:
SELECT * FROM `books` AS `Book` WHERE`Book`.`title` LIKE '%CakePHP%'
在CakePHP中,我们会像下面这样使用find()方法
$this->Book-> find('all',array(
'conditions'=>
array('Book.title'=> "LIKE %CakePHP%")
)
);
3,如果我们想查找由'Anupom Syam' , 'AhsanulBari' 以及 'DavidBarnes'等人撰写的所有书籍,我们可以使用下面这个SQL语句来实现:
SELECT * FROM `books` AS `Book` WHERE Book.author_name IN ( 'Anupom Syam','Ahsanul Bari', 'David Barnes')
在CakePHP中,我们可以像下面这样使用find()方法来实现上面SQL语句的效果
$this->Book-> find('all', array(
'conditions' => array(
'Book.author_name' => array(
'Anupom Syam',
'Ahsanul Bari',
'David Barnes'
)
)
)
);我们可以通过在对应的字段名后面设置一个包含有值的数组来实现与SQL逻辑运算符IN()同等的效果。
4,如果我们想查找所有由'DavidBarnes' 撰写并且书名中包含有”CakePHP“一词的所有书本,我们可以使用下面这个SQL语句实现:
SELECT * FROM `books` AS `Book` WHEREBook.author_name LIKE 'David Barnes' ANDBook.title LIKE '%CakePHP%')
在CakePHP中,我们使用下面这段代码:
$this->Book-> find('all', array(
'conditions' => array(
'Book.author_name'=> 'David Barnes',
'Book.title'=> '%CAKEPHP%'
)
)
);如要加入更多的条件,我们只需在条件数组中添加更多的键值对( key-value pairs)即可,条件之间默认是使用AND逻辑运算符来连接起来的
5,如果我们想查找所有由'DavidBarnes'撰写或者书名中包含有”CakePHP“一词的书,我们只需使用下面这段SQL语句:
SELECT * FROM `books` AS `Book` WHEREBook.author_name LIKE ( 'David Barnes' OR Book.title LIKE '%CakePHP%')在CakePHP中,它所对应的代码是:
$this->Book-> find('all', array(
'conditions'=> array(
"or" =>
array
(
"Book.author_name" => "David Barnes",
"Book.title" => "%CAKEPHP%"
)
)
)
);CakePHP接受所有有效的SQL逻辑操作符。如果我们想使用默认操作符AND以外的一些操作符,我们只需将相应的条件约束分类到一个数组中。然后我们必须把这个数组作为键所对应的值,将其添加到以”逻辑预算符“命名的键后面。(译者:汗真够绕的,直接看例子要比这明白的多。)
6,如果我们想查找所有由'David Mercer' 撰写的“Drupal”方面的书以及由'James Kennard'撰写的有关'Joomla' 的书,我们可以使用下面这段SQL语句
SELECT * FROM `books` AS `Book` WHERE ((Book.author_name LIKE 'DavidMercer' ANDBook.title LIKE '%Drupal%') OR (Book.author_name LIKE'James Kennard' AND Book.title LIKE '%Joomla%')
)在CakePHP中,我们可以将嵌套数组作为Condition(条件)键所对应的值,然后执行这一查询:
$this->Book->find('all', array(
'conditions' =>array(
'or'=> array(
array(
'Book.author_name'=> 'LIKE David Mercer',
'Book.title'=> 'LIKE %Drupal%'
),
array(
'Book.author_name'=> 'LIKE James Kennard',
'Book.title'=>'LIKE %Joomla%'
)
)
)
)
);除了find()方法外,CakePHP也提供一些快捷的函数来执行数据检索的任务。它们被总称为“魔法查询函数”( magic find functions)。接下来我们将学习如何使用这些魔法查询函数来对数据进行检索。