запрос к базе данных в action.class перейти на lib / model - PullRequest
0 голосов
/ 06 июня 2011

у меня есть:

  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 ]

2 голосов
/ 06 июня 2011

Я предполагаю, что вы создали newFunction в lib/model/MessagesTable.class.php.

$this->newFunction() не будет работать, потому что $this относится к текущему экземпляру действия, а не к таблице вашей модели.Вам нужно использовать либо:

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

или

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

, они оба делают одно и то же, так что это просто вопрос предпочтений.

Кроме того, вы делаетене устанавливать значение для $id в коде вашего действия.

1 голос
/ 06 июня 2011

Я думаю, что ваша проблема здесь в том, что вы использовали нестатический метод для извлечения объекта с помощью запроса, а ссылка "this" дает вам экземпляр sfAction в:

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

Iпредложил бы изменить объявление новой функции в классе модели на что-то вроде этого (создайте эту функцию в /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); 
  }
0 голосов
/ 07 июня 2011

Почему бы вам не воспользоваться «Магическими методами», которые предоставляет Doctrine?

Этот запрос может быть таким:

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

И тогда вам не нужно определять новый метод. Чтобы узнать больше, посмотрите на страницу документации доктрины, в магический метод findBy *

...