action.class中的数据库查询移动到lib / model

时间:2011-06-06 15:11:18

标签: php oop symfony1 doctrine symfony-1.4

我有:

  public function executeTest(sfWebRequest $request)
  {
            $query = Doctrine_Query::create()
            ->from('Messages')
            ->where('id = ?', $id);
            $query->fetchArray();
  }

我在lib / model中完成了功能:

        public function newfunction($id)
    {
            $query = Doctrine_Query::create()
            ->from('Messages')
            ->where('id = ?', $id);

            return $query->fetchArray();

    }

现在有:

  public function executeTest(sfWebRequest $request)
  {
         $this->newfunction($id);
  }

但我有错误:

sfException:调用未定义的方法messagesActions :: newfunction。

如果:

  public function executeTest(sfWebRequest $request)
  {
         $this->newfunction($id);
  }

我有

Fatal error: Call to a member function newFunction() on a non-object in

我该怎么办?

3 个答案:

答案 0 :(得分:2)

我假设您在newFunction中创建了lib/model/MessagesTable.class.php

$this->newFunction()无法使用,因为$this引用当前操作实例,而不是模型的表。你需要使用:

Doctrine_Core::getTable("Messages")->newFunction($id);

MessagesTable::getInstance()->newFunction($id);

他们都做同样的事情,所以这只是一个偏好问题。

此外,您没有在操作代码中为$id设置值。

答案 1 :(得分:1)

我认为你在这里遇到的问题是你使用非静态方法来使用查询获取对象,并且“this”引用为你提供了一个sfAction实例:

 public function executeTest(sfWebRequest $request)
  {
         $this->newfunction($id);
  }

我建议将模型类中的newfunction声明更改为(在/lib/model/Doctrine/MessagesTable.class.php中创建此函数):

public static newfunction($id)
{
    $query = Doctrine_Query::create()
    ->from('Messages')
    ->where('id = ?', $id);

    return $query->fetchArray();
}

现在你的行动应该是这样的:

  public function executeTest(sfWebRequest $request)
  {
    [..]//i'm assuming that id is set somewhere before this and is valid
         MessagesTable::newfunction($id); 
  }

答案 2 :(得分:0)

为什么不利用Doctrine提供的'魔术方法'?

该查询可能是这样的:

Doctrine_Core::getTable("Messages")->findById($id); 

然后,您不需要定义新方法。 要了解更多信息,请查看de doc magic method findBy*

中的de doc document页面