2012-05-07 6 views
3

私はすでにthisをチェックしましたが、私のエラーは異なっているようです。この最後メソッド名は、findByまたはfindOneByで始まる必要があります。 (キャッチされない例外)

$em = $this->getDoctrine()->getEntityManager(); 
$operarios = $em->getRepository('GitekUdaBundle:Operario')->findOperariosordenados(); 

<?php 

namespace Gitek\UdaBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

/** 
* OperarioRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class OperarioRepository extends EntityRepository 
{ 
    public function findOperariosordenados() 
    { 
     $em = $this->getEntityManager(); 
     $consulta = $em->createQuery('SELECT o FROM GitekUdaBundle:Operario o 
             ORDER BY o.apellidos, o.nombre'); 

     return $consulta->getResult(); 
    }  
} 

この私のコントローラ、私はリポジトリを呼び出す:これは私のOperarioRepositoryある

[2012-05-07 14:09:59] request.CRITICAL: BadMethodCallException: Undefined method 'findOperariosordenados'. The method name must start with either findBy or findOneBy! (uncaught exception) at /Users/gitek/www/uda/vendor/doctrine/lib/Doctrine/ORM/EntityRepository.php line 201 [] [] 

- 私はこのエラーを取得します私の団体:

<?php 

namespace Gitek\UdaBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Gitek\UdaBundle\Entity\Operario 
* 
* @ORM\Table(name="Operario") 
* @ORM\Entity(repositoryClass="Gitek\UdaBundle\Entity\OperarioRepository") 
*/ 
class Operario 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $nombre 
    * 
    * @ORM\Column(name="nombre", type="string", length=255) 
    */ 
    private $nombre; 
    ---- 
    ---- 

助けか手がかり?事前

EDITで

ありがとう:prod環境でのdevの環境上の細かい機能しますが、ありません。

答えて

7

あなたはすでにあなたが再取得することする必要はありません、reposoritoryです。

*リポジトリ内のすべてのメソッドは

  • クエリビルダまたはハンドクエリは、単純なreturn $this->findBy();を使用することができますあまりにも多くの仕事で作られた注意し、また$this

    と同様に使用することができます。

  • findBy()
  • は... Doctrine\ORM\EntityRepositoryコードの代わりに生のクエリを使用しての
  • を参照してください最初のクエリビルダを試してみてください、第二は、発注用で、最初の、3つのパラメータを持っている関係とゲッターの配列です。私のサンプルを見てください。

あなたのコード

私はあなたが単純に行うことをお勧め:

public function findOperariosordenados() 
{ 
    $collection = $this->findBy(array(), array('apellidos','nombre')); 
    return $collection; 
} 

あなたが唯一の私のリポジトリのEntityRepository

つが必要になります。注意すべき

物事を:

  • Orderあなたが本当に配列、$array = $reposiroty->getOneUnhandledContainerCreate(Query::HYDRATE_ARRAY)
  • ContainerCreateOrder@ORM\InheritanceType("SINGLE_TABLE")Orderの延長である必要がある場合はUserエンティティ
  • を使用して$ownerような関係を持っています。しかし、この質問の範囲からかなり。

それは役に立つことができます

<?php 

namespace Client\PortalBundle\Entity\Repository; 


# Internal 
use Doctrine\ORM\EntityRepository; 
use Doctrine\ORM\QueryBuilder; 
use Doctrine\ORM\Query; 
use Doctrine\Common\Collections\ArrayCollection; 


# Specific 


# Domain objects 


# Entities 
use Client\PortalBundle\Entity\User; 


# Exceptions 



/** 
* Order Repository 
* 
* 
* Where to create queries to get details 
* when starting by this Entity to get info from. 
* 
* Possible relationship bridges: 
* - User $owner Who required the task 
*/ 
class OrderRepository extends EntityRepository 
{ 

    private function _findUnhandledOrderQuery($limit = null) 
    { 
     $q = $this->createQueryBuilder("o") 
       ->select('o,u') 
       ->leftJoin('o.owner', 'u') 
       ->orderBy('o.created', 'DESC') 
       ->where('o.status = :status') 
       ->setParameter('status', 
        OrderStatusFlagValues::CREATED 
       ) 
       ; 

     if (is_numeric($limit)) 
     { 
      $q->setMaxResults($limit); 
     } 
     #die(var_dump($q->getDQL())); 
     #die(var_dump($this->_entityName)); 
     return $q; 
    } 


    /** 
    * Get all orders and attached status specific to an User 
    * 
    * Returns the full Order object with the 
    * attached relationship with the User entity 
    * who created it. 
    */ 
    public function findAllByOwner(User $owner) 
    { 
     return $this->findBy(array('owner'=>$owner->getId()), array('created'=>'DESC')); 
    } 



    /** 
    * Get all orders and attached status specific to an User 
    * 
    * Returns the full Order object with the 
    * attached relationship with the User entity 
    * who created it. 
    */ 
    public function findAll() 
    { 
     return $this->findBy(array(), array('created'=>'DESC')); 
    } 



    /** 
    * Get next unhandled order 
    * 
    * @return array|null $order 
    */ 
    public function getOneUnhandledContainerCreate($hydrate = null) 
    { 
     return $this->_findUnhandledOrderQuery(1) 
        ->orderBy('o.created', 'ASC') 
        ->getQuery() 
        ->getOneOrNullResult($hydrate); 
    } 



    /** 
    * Get All Unhandled Container Create 
    */ 
    public function getAllUnhandledContainerCreate($hydrate = null) 
    { 
     return $this->_findUnhandledOrderQuery() 
        ->orderBy('o.created', 'ASC') 
        ->getQuery() 
        ->getResult($hydrate); 
    } 
} 
5

キャッシュをクリアしましたか?

php app/console cache:clear --env=prod --no-debug

+3

はい、何度も何度もさまざまな方法で対応しています。とんでもない –

0

app/config/config_prod.ymlは、教義のために指定されたキャッシュドライバを持っています

doctrine: 
    orm: 
     metadata_cache_driver: apc 
     result_cache_driver: apc 
     query_cache_driver: apc 

私はこれらの機能を使用してAPCキャッシュをクリア呼び出す:

if (function_exists('apcu_clear_cache')) { 
    // clear system cache 
    apcu_clear_cache(); 
    // clear user cache 
    apcu_clear_cache('user'); 
} 

if (function_exists('apc_clear_cache')) { 
    // clear system cache 
    apc_clear_cache(); 
    // clear user cache 
    apc_clear_cache('user'); 
    // clear opcode cache (on old apc versions) 
    apc_clear_cache('opcode'); 
} 

そして空になったapp/cache/ディレクトリ。

しかし私はdev環境ですべてがうまくいきましたが、prod環境でこのエラーが発生し続けました。

私は最終的に私の仮想サーバーを再起動し、それはトリックでした。

これは間違いなく私にキャッシュ問題の疑いに繋がります。私はまた、キャッシュをクリアして(gracefuly)(php - Does a graceful Apache restart clear APC? - Stack Overflow)、唯一のWebサーバーを再起動

にしようとする次回はそうでない場合は、/etc/php5/apache2php.iniapc.stat = 1http://php.net/manual/en/apc.configuration.php#ini.apc.stat)を設定することも、ここで提案としては良い考えのようだ:do we need to restart apache + APC after new version deployment of app?

UPDATE

私の開発サーバは、APCがAPCuをインストールしていません。 apcu_clear_cache()への最初の2回の呼び出しでPHP致命的なエラーが発生し、APCキャッシュがクリアされなくなりました。

apcu_clear_cache()またはapc_clear_cache()を呼び出す前に、システムで使用するキャッシュを確認してください。その後、キャッシュをクリアして厄介な例外を取り除くために、仮想マシンやWebサーバーを再起動する必要はありません。

ifブロックを追加してAPCまたはAPCu固有の機能を実行します。

関連する問題