Phalcon在模型中执行sql查询

cjr*_*jrb 4 php mysql sql phalcon

目前我决定将Phalcon php作为Codeigniter的替代php框架.我按照网站上的教程进行操作,它的工作方式非常好.我仍然试图绕过一些事情.

根据我的理解,模型与数据库绑定并映射到数据库中的表.我有一个项目,我需要使用2个或更多数据库.该项目有一个后端(一个数据库)和多个前端(另一个数据库).最简单的方法是运行自定义MySQL查询以从多个数据库中获取数据.我不知道如何从Phalcon的模型中做到这一点.我查看了stackoverflow,尝试了一些建议,但仍然没有运气.

我想有一些简单的方法可以从模型中这样做,比如$ result = $ this-> query("SELECT*FROM backend.users") - > fetch(); 但它不起作用.

在这里我有:

控制器:

class SignupController extends \Phalcon\Mvc\Controller{

  function indexAction()
  {

  }

  function registerAction()
  {
    $user = new Users();
    $result=$user->saveNewUser();
    print_r($result); // Nothing

    //$result=$this->db->query("SELECT * FROM phalcon.system_users")->fetchAll();
    //print_r($result); // Works

    $this->view->disable();
   }

}
Run Code Online (Sandbox Code Playgroud)

模型:

class Users extends Phalcon\Mvc\Model
{
   public function saveNewUser()
   {
      return $this->db; // how to run the query???

   }
}
Run Code Online (Sandbox Code Playgroud)

引导:

try {

//Register an autoloader
$loader = new \Phalcon\Loader();
$loader->registerDirs(array(
    '../app/controllers/',
    '../app/models/'
))->register();

//Create a DI
$di = new Phalcon\DI\FactoryDefault();

//Setup the database service
$di->set('db', function(){
    return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
        "host" => "localhost",
        "username" => "root",
        "password" => "123456",
        "dbname" => ""
    ));
});

//Setup the view component
$di->set('view', function(){
    $view = new \Phalcon\Mvc\View();
    $view->setViewsDir('../app/views/');
    return $view;
});

//Setup a base URI so that all generated URIs include the "tutorial" folder
$di->set('url', function(){
    $url = new \Phalcon\Mvc\Url();
    $url->setBaseUri('/phalcon/');
    return $url;
});

//Handle the request
$application = new \Phalcon\Mvc\Application($di);

echo $application->handle()->getContent();

} catch(\Phalcon\Exception $e) {
     echo "PhalconException: ", $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

我喜欢Codeigniter拥有它的方式,不确定Phalcon是否有一个简单的方法.可能是我需要加载扩展或库来在模型中执行此操作.

提前致谢!

cjr*_*jrb 6

谢谢jodator,

但是我需要它有点不同.我想从Model中执行sql查询.

花了更多的时间进行测试和试验后,我想我已经明白了.以防万一有人同样需要能够从模型中执行mysql查询,这就是我想出来的方式.我不确定是否会影响性能,但它确实有效.

创建一个新的Model类并调用它,例如BaseModel.php,其中包含下一个:

class BaseModel extends Phalcon\Mvc\Model
{
   public $db;

   public function initialize()
   {
      $this->db=$this->getDi()->getShared('db');
   }   
} 
Run Code Online (Sandbox Code Playgroud)

BaseModel将扩展Phalcon模型,我创建了一个名为$ db的公共属性.然后在initialize()上我使用$ this-> getDi() - > getShared('db')来获取共享依赖注入器并将其分配给我们的$ this-> db.现在,扩展此BaseModel的所有模型都可以访问该属性.然后在我的用户模型中,我有下一个:

class Users extends BaseModel // Users extends out BaseModel and will have access to $db
{

   public function test()
   {
      //print_r(\Phalcon\Di::getDefault()->getShared('db')); // This is the ugly way to grab the connection.

      $result=$this->db->query("SELECT * FROM phalcon.system_users"); // Working now
      echo $result->numRows();
      print_r($result->fetchAll());
   }

}
Run Code Online (Sandbox Code Playgroud)

现在它工作得很漂亮.我还想到了一个想要在Phalcon中使用mysql查询(PDO)的人可能会感兴趣的事情.我总是在获取数据时使用FETCH_ASSOC,为了使生活更轻松,您可以在连接时默认设置FETCH_ASSOC,这样您每次获取数据时都不需要setAttribute.我是这样做的.在引导程序中,为数据库连接设置DI类时,可以包含选项....

//Setup the database service
$di->set('db', function(){
    return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
        "host" => "localhost",
        "username" => "root",
        "password" => "123456",
        "dbname" => "",
        'options' => [PDO::ATTR_CASE => PDO::CASE_LOWER, PDO::ATTR_PERSISTENT => TRUE,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC],
    ));
});
Run Code Online (Sandbox Code Playgroud)

如您所见,最后一个选项设置PDO :: ATTR_DEFAULT_FETCH_MODE.

如果有人有更好的方法,请在此处发布.

我希望它能像我一样帮助Phalcon新手:)