mysql - 具有条件 db_or 等的 Drupal 7 DB API 查询

标签 mysql drupal drupal-7

我在让 sql 查询在 drupal 7 中工作时遇到了一些问题。 基本上,我想知道我的 db_api 的 drupal 代码对于我希望它生成的 SQL 查询是否正确。

请看下面的代码:

/*
  SQL Query
  Note: The the 'a' in '%a%', is just a sample of some text input by a user. 
*/

SELECT u.uid, fn.field_first_name_value, ln.field_last_name_value 
FROM role r
JOIN users_roles ur ON (r.rid = ur.rid)
JOIN users u ON (u.uid = ur.uid)
JOIN field_data_field_first_name fn ON (fn.entity_id = u.uid)
JOIN field_data_field_last_name ln ON (ln.entity_id = u.uid)
WHERE (fn.field_first_name_value LIKE '%a%' OR ln.field_last_name_value LIKE '%a')
AND r.name = 'custom_role'
LIMIT 0, 5


/*
   DRUPAL 7 DB API CODE
 */

$name = $_POST['name'];
$res = db_select('role', 'r');

$res->join('users_roles', 'ur', 'ur.rid = r.rid');
$res->join('users', 'u', 'u.uid = ur.uid');
$res->join('field_data_field_first_name', 'fn', 'fn.entity_id = u.uid');
$res->join('field_data_field_last_name', 'ln', 'ln.entity_id = u.uid');

$res->fields('u', array('uid'));
$res->fields('fn', array('field_first_name_value'));
$res->fields('ln', array('field_last_name_value'));                        

$or = db_or()->condition('fn.field_first_name_value', '%'.db_like($name).'%', 'LIKE');
$or->condition('ln.field_first_name_value', '%'.db_like($name).'%', 'LIKE');

$res->condition($or)->condition('r.name', 'custom_role', '=');
$res->range(0,5);            

$res->execute();

此外,如果我可以通过 db api 查看生成的 sql,那将非常适合调试。 谢谢。

最佳答案

我无法执行它,因为我没有像你一样的表,但你生成的查询看起来不错。

SELECT u.uid AS uid, fn.field_first_name_value AS field_first_name_value, ln.field_last_name_value AS field_last_name_value
FROM
{role} r
INNER JOIN {users_roles} ur ON ur.rid = r.rid
INNER JOIN {users} u ON u.uid = ur.uid
INNER JOIN {field_data_field_first_name} fn ON fn.entity_id = u.uid
INNER JOIN {field_data_field_last_name} ln ON ln.entity_id = u.uid
WHERE ( (fn.field_first_name_value LIKE :db_condition_placeholder_0 ESCAPE '\\') OR (ln.field_first_name_value LIKE :db_condition_placeholder_1 ESCAPE '\\') )AND (r.name = :db_condition_placeholder_2)
LIMIT 5 OFFSET 0

如果你想自己打印查询,你可以使用

print $res->__toString() . "\n\n";
var_export($res->getArguments());

或者

watchdog('MY_QUERY_DEBUG', $res->__toString(), $res->getArguments());

将其添加到您的看门狗日志中。

关于mysql - 具有条件 db_or 等的 Drupal 7 DB API 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30128746/

相关文章:

php - 将 MySQL 结构导入实时 SQL 数据库

Drupal 模块以表格格式显示数据

php - Drupal hook_views_post_execute 没有被调用

php - Drupal Zen 子主题,添加到标题区域下方的标题内容

drupal-7 - Drupal Commerce 动态订单项

mysql - 由于这些错误,无法继续进行 drupal 安装

java - 在 mysql 查询中使用带有 like 关键字的 limit 给出 0 行

mysql - 多次加入来收集用户评分?

java - 未使用 Hibernate 以正确的格式从数据库获取数据

mysql - 由于转换记录 : 失败,请求回滚字段 "field_images"