【问题标题】:Execute plain SQL query in Extbase repository在 Extbase 存储库中执行普通 SQL 查询
【发布时间】:2014-06-18 21:23:49
【问题描述】:

我正在尝试在 Extbase 存储库中执行查询,但它没有返回任何结果。

这是我的语法,如果有人知道问题,请帮忙。

在存储库文件中;

public function getImages( $uidOfCE, $pid ) {

    $query = $this->createQuery(); 
    $query->statement('SELECT sf.identifier,sfm.title,sfr.description 
        FROM tt_content AS tc 
        LEFT JOIN sys_file_reference sfr ON sfr.`uid_foreign` = tc.uid 
        LEFT JOIN sys_file AS sf ON sf.`uid` = sfr.uid_local 
        LEFT JOIN sys_file_metadata AS sfm ON sfm.`file` = sf.uid 
        WHERE tc.uid = '.$uidOfCE.' 
        AND tc.pid='.$pid.' 
        AND tc.list_type = "myimage_gallery" 
        AND sfr.`deleted` = 0 AND sfr.`hidden`= 0  
        AND tc.`deleted` = 0 AND tc.`hidden`= 0  AND  tc.sys_language_uid ='.$GLOBALS['TSFE']->sys_language_uid.' 
        AND sfr.fieldname = "tx_myext_images" AND sfr.tablenames = "tt_content"');

    return $query->execute();
}

在控制器中:

$myimagegalleries = $this->myimagegalleryRepository->getImages(
$uidOfCE, $this->cObj->data['pid'] );

是否可以在 extbase 存储库中创建自定义查询?

【问题讨论】:

标签: php typo3 fluid extbase


【解决方案1】:
$Query = $this->createquery();
$Query->getQuerySettings()->setReturnRawQueryResult(TRUE);
$Query->getQuerySettings()->setRespectStoragePage(FALSE);
$Query->statement('your query'); 
return $Query->execute();

在你的控制器中

class your_Controller_name extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { 

    protected $myimagegalleryRepository;

    public function yourAction() {
        $myimagegalleries = $this->myimagegalleryRepository->getImages(
        $uidOfCE, $this->cObj->data['pid'] );
    }
}

setReturnRawQueryResult 如果为真,您将得到数组中的结果。

尽量避免声明在这里看到警告:http://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/3-implement-individual-database-queries.html

【讨论】:

    【解决方案2】:

    如果可以使用 Extbase QOM 解决,则不鼓励您这样做,但它确实有效。

    如果没有返回任何结果,可能是您的查询约束设置不正确。

    调试$uidOfCE$pid以查看它们是否已设置。如果没有,请修复它们。如果是,请在 MySQL/phpMyAdmin 中执行整个查询,看看是否有任何结果。如果您不这样做,请修复您的查询以使其正常工作。

    【讨论】:

    • 嗨 lorenz,我检查了 $uidOfCE 和 $pid 并正确显示了值。我不知道提供空结果的确切原因是什么。你能帮帮我吗?
    • 您是否也在 phpMyAdmin 中运行了查询?
    • 是的。我得到了答案。感谢您的反馈。
    【解决方案3】:

    如果您做不到,我们无法猜测您的查询出了什么问题...查找查询问题的最简单方法是启用语句日志记录,因此您可以复制它并尝试使用通用 DB GUI 运行,即' like in this tip(也可以查看马腾的回答)。

    我个人拍摄它缺少存储 PID 的配置,无论如何,确保测试语句会给你正确的答案,或者至少是一些明智的线索。

    【讨论】:

      【解决方案4】:

      在(极少数)需要运行复杂 sql(尤其是插入、更新、删除)语句的情况下,可以访问 Doctrine DBAL Connection 对象的 exec 方法,该对象是 Extbase Connection 的祖先对象:

      use TYPO3\CMS\Core\Database\Connection;
      
      class MyConnection
      {
          /**
           * myExec
           * Exposes the exec method of the Doctrine DBAL which is non public
           * in the Extbase Connection object. This is feasible, using
           * PHP Reflection Object and ReflectionMethod.
           *
           * @param $conn
           * @param $statement
           *
           * @return int
           */
          public function myExec(Connection $conn, $statement)
          {
              $ro = new \ReflectionObject($conn);
              $rm = $ro->getMethod('exec');
              $rm->setAccessible(true);
              $i = $rm->invoke($conn, $statement);
              return $i;
          }
      
      }
      

      请记住,此方法绕过了框架提供的所有反 sql 注入机制,因此请谨慎使用,风险自负。

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 1970-01-01
        • 2020-01-11
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多