【问题标题】:Using join in zend social engine 4 widget在 zend 社交引擎 4 小部件中使用加入
【发布时间】:2013-03-05 18:41:14
【问题描述】:

我在为 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),整个选项卡都会消失并导致调试问题。

这是我所拥有的:

<?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 语句?

【问题讨论】:

  • 我看不出您发布的代码有问题。但是你说有问题但不是问题是什么——你有错误吗?还是查询没有返回您期望的结果?
  • 问题是当我使用代码的“加入”版本时,小部件不可见。我怀疑这是因为某种错误。我直接在数据库上测试了查询,它工作正常。 Dreamweaver、浏览器错误控制台或据我所知 SE 控制面板错误日志没有给出错误。感谢您的关注:-)

标签: php zend-framework zend-db socialengine


【解决方案1】:

再次查看您的代码后,我认为问题出在这一行:

$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);

您可以通过简单地回显选择对象来调试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']));

【讨论】:

    【解决方案2】:

    这是我加入三个表的示例

         $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);
    

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2012-02-28
      • 2017-02-16
      • 1970-01-01
      • 2013-02-09
      • 2016-06-26
      相关资源
      最近更新 更多