Phalcon在模型中执行sql查询

时间:2014-03-21 21:47:21

标签: php mysql sql phalcon

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

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

我猜应该有一些简单的方法可以从模型中执行此操作,例如 $ result = $ this->查询(“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();
   }

}

型号:

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

   }
}

自举:

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();
}

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

提前致谢!

2 个答案:

答案 0 :(得分:5)

谢谢jodator,

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

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

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

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

   public function initialize()
   {
      $this->db=$this->getDi()->getShared('db');
   }   
} 

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());
   }

}

现在效果很好。我还想到了一个想要在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],
    ));
});

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

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

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

答案 1 :(得分:3)

您需要在配置中设置两个database services,例如:

//设置数据库服务

$di->set('db', function(){ /* like in what you have */ });
// then the other one
$di->set('dbBackend', function(){ /* like in what you have */ });

然后在您的模型中更改数据库服务

public function initialize()
{
    parent::initialize();
    $this->setConnectionService('dbBackend');
    // or $this->setWriteConnectionService('dbB') and $this->setReadConnectionService('dbA')
}

然后只是$model->create()

但是,如果您想在不同的数据库上运行查询,可以查看Pdo\Mysql Adapter

此外,模型可以设置表格名$this->setSource()和架构$this->setSchema()