目前我决定将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是否有一种简单的方法。可能是我需要加载扩展或库来在模型中执行此操作。
提前致谢!
答案 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()
。