【问题标题】:How to execute custom query in CakePHP如何在 CakePHP 中执行自定义查询
【发布时间】:2014-03-30 15:04:39
【问题描述】:

我目前正在尝试在 CakePHP 框架中执行自定义查询,这意味着我不想使用 CakePHP 语法,而是执行像 SELECT * FROM post ORDER BY id desc 这样的普通 SQL 查询。

我不知道该怎么做。我阅读了几个类似问题的答案,但仍然无效。

据我所知,我应该把函数放在:

public function testx()
{
    $sql = "SELECT * FROM posts WORDER by id desc";
    return $this->query($sql);
}

Post 归档到Model 目录中,然后输入以下代码:

$result = $this->Post->testx();

PostsControllerController 目录中的index 函数。

我还是不知道如何打印出View/Posts/index.ctp中的数据。

提前感谢您的任何回答。

【问题讨论】:

  • 为什么当 ORM 提供大量特性和适当的转义时,你会像普通 SQL 一样执行最琐碎的 SQL 查询?甚至可以使用 ORM 构建非常复杂的查询。您所做的是恕我直言,这是错误的,并且否定了框架的好处。

标签: php sql cakephp


【解决方案1】:

您可以使用连接管理器运行自定义 SQL 查询。按照 cake php 文档中的这篇文章使用连接管理器:https://book.cakephp.org/3.0/en/orm/database-basics.html

use Cake\Datasource\ConnectionManager;
$connection = ConnectionManager::get('default');
$results = $connection->execute('SELECT * FROM articles')->fetchAll('assoc');

之后要在视图中查看结果 (index.ctp),您必须设置结果变量

$this->set('result',$result);

现在您可以使用结果变量在 index.ctp 中查看数据库中的数据。

【讨论】:

    【解决方案2】:

    如果您想在没有模型的情况下执行删除(或任何其他)查询,那么您应该尝试

    $db = ConnectionManager::getDataSource('default');
    $db->rawQuery("DELETE FROM table WHERE id=5");
    

    【讨论】:

      【解决方案3】:
      public function index(){
          $this->loadModel('Post'); //or you can load it in beforeFilter()
          $data=$this->Post->query('SELECT * FROM posts ORDER by id desc');
          $this->set('data',$data);
      }
      

      在您的视图文件 index.ctp 中。写下代码

      <?php
           if($data) {
                echo "<pre>";
                print_r($data);
           } else {
                echo 'no data found';
           }
      ?>
      

      【讨论】:

      • 带参数的查询呢?
      • @ZiadAkiki 你能详细说明一下吗?所以,我可以帮忙。
      • 例如 $this-&gt;Post-&gt;query('SELECT * FROM posts ORDER by id desc WHERE id = ?', $id); 是否有效?换句话说,如果我需要在查询中安全地传递一个参数。
      • @ZiadAkiki 是的。您可以传递参数。我相信您应该使用 CakePHP 3 ORM 而不是 Query Builder 来保护查询。希望这会有所帮助。
      【解决方案4】:
      App::import("Model", "ModelName");  
          $model = new ModelName();  
          $query = "Select * from tablename";
          $data = $model->query($query);
      

      【讨论】:

        【解决方案5】:
        $this->Post->query("SELECT * FROM posts ORDER by id desc");
        

        【讨论】:

          【解决方案6】:

          控制器

          $result = $this->Post->testx();
          $this->set('posts', $result);
          

          查看

          debug($posts);
          foreach ($posts as $post) {
             // ...
          }
          

          【讨论】:

          • 我试过了,但不是打印出我得到的变量“通知 (8):未定义的索引:发布 [APP/View/Posts/index.ctp,第 17 行]”。我使用 $post['Post']['id'] 打印出变量。但它会为表中的所有行打印出相同的错误消息,因此 SQL 查询至少部分有效。
          • 您使用过debug($posts) 吗?可能是 $post['post']。
          【解决方案7】:

          在这种情况下不需要额外的函数testx()。您还可以直接在索引函数中使用自定义查询,例如,

          public function index(){
              $data=$this->Post->query('SELECT * FROM posts ORDER by id desc');
              $this->set('data',$data);
          }
          

          并在您的 index.ctp 文件中打印数据,

          <?php print_r($data); ?>
          

          希望这会对你有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多