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是否有一个简单的方法.可能是我需要加载扩展或库来在模型中执行此操作.
提前致谢!
谢谢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新手:)
| 归档时间: |
|
| 查看次数: |
18409 次 |
| 最近记录: |