我正在尝试在查询中使用“join”,同时开发一个位于Social Engine 4模块中的小部件。我在Dreamweaver中工作。我正在尝试替换此工作代码:
//creates query to get user's region
$select = $db->select();
$select->from("engine4_user_fields_search");
$select->where("item_id = ?", $user_id['user_id']);
$stmt = $db->query($select);
$result = $stmt->fetchAll();
然后我必须使用一个长的if-else链,使用“魔术数字”在索引中添加和减去以获得结果。
使用join,我不需要做所有这些。我可以有一个简单的查询并显示结果。我正在处理的小部件位于一个tab容器中,所以当出现问题时(每次我使用join),整个选项卡都会消失并使调试成为问题。
这就是我所拥有的:
<?php
class Widget_RegionalBreakingNewsController extends Engine_Content_Widget_Abstract
{
public function indexAction()
{
//connect to DB
$file = APPLICATION_PATH . '/application/settings/database.php';
$options = include $file;
$db = Zend_Db::factory($options['adapter'], $options['params']);
$select = new Zend_Db_Select($db);
$db->getConnection();
//end DB setup
$user_id = Engine_Api::_()->user()->getViewer();
//SELECT * FROM engine4_user_fields_search as s
//join engine4_user_fields_options as o
//WHERE item_id = <current user's ID> AND s.field_7+22 = o.option_id
$select = $db->select();
$select->from(array('s' => 'engine4_user_fields_search'),
array('s.field_7', 's.user_id'))
->joinInner(array('o' => 'engine4_user_fields_options'),
's.field_7+22 = o.option_id');
$select->where("s.item_id = ?", $user_id['user_id']);
$stmt = $db->query($select);
$result = $stmt->fetchAll();
//print_r($result);
由于这是我用Zend开发的第一周,所以不要忽视最简单的错误。我很容易不知道可能有所作为的简单约定。如果有人可以提供帮助,将不胜感激。
PS无论如何不使用Zend select函数并执行常规SQL语句?
答案 0 :(得分:0)
再看一下你的代码后,我认为问题就出在这一行:
$select->from(array('s' => 'engine4_user_fields_search'),
array('s.field_7', 's.user_id'))
你告诉它只选择两列(相当于SELECT s.field_7, s.user_id FROM ...
),我认为这不是你想要的?您说的第一个示例是从engine4_user_fields_search中选择所有列。您可以将第二个数组留在那里以获取该表中的所有列。
另外,这个:
$stmt = $db->query($select);
$result = $stmt->fetchAll();
可以写成:
$result = $db->fetchAll($select);
您可以通过简单地回显select对象来调试Zend_Db_Select
问题,这将为生成的查询提供一个字符串:
echo $select;
如果您更喜欢编写原始SQL,您只需将其作为字符串传递给查询函数:
$db->query("
SELECT * FROM engine4_user_fields_search as s
join engine4_user_fields_options as o
WHERE item_id = ? AND s.field_7+22 = o.option_id
", array($user_id['user_id']));
答案 1 :(得分:0)
以下是我加入三个表
的示例 $opsDb = Engine_Db_Table::getDefaultAdapter();
$ocrSelect = $opsDb->select()
->from(array('ops'=>'engine4_user_fields_options'), array('field_id', 'option_id','label'))
->join(array('map'=>'engine4_user_fields_maps'),'map.child_id = ops.field_id','')
->join(array('meta'=>'engine4_user_fields_meta'),'map.`child_id` = meta.field_id', '')
->where('map.option_id =?',$profileTypeId)
->where('meta.type LIKE \'outcomeresult\'');
$outcomeResults = $opsDb->fetchAll($ocrSelect);