3

私はすでにこれをチェックしましたが、私のエラーは異なっているようです。

このエラーが発生します:

[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 [] []

これは私のOperarioRepositoryです:

<?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();
    }    
}

これは私のコントローラーで、リポジトリと呼んでいます。

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

最後に、これは私のエンティティです。

<?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;
    ----
    ----

何か助けや手がかりは?

前もって感謝します

編集:開発環境では正常に動作しますが、本番環境では動作しません。

4

3 に答える 3

7

あなたはすでにリポジトリにいます、あなたはそれを再取得する必要はありません。

*リポジトリ内のすべてのメソッドは、次のように使用できます$this

また、注意してください

  • クエリビルダーまたはハンドメイドクエリは、単純なreturn $this->findBy();ものを使用できる場合は非常に手間がかかります。
  • findBy()3つのパラメーターがあります。1つはリレーションとゲッターの配列で、2つ目は順序付け用です。Doctrine\ORM\EntityRepositoryコードを参照してください。
  • Rawクエリを使用する代わりに...最初にクエリビルダーを試してください。私のサンプルを見てください。

あなたのコード

私はあなたが単にすることをお勧めします:

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

必要なのはEntityRepository

私のリポジトリの1つ:

注意事項:

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

それは役に立つかもしれません:

 <?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);
    }
}
于 2012-05-15T16:41:27.300 に答える
5

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

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

于 2012-05-07T14:15:18.210 に答える
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/そして、ディレクトリを空にしました。

しかし、開発環境ではすべてが正常である間、私は本番環境でこのエラーを受け取り続けました。

私はついに仮想サーバーを再起動しました、そしてそれはトリックをしました。

これは間違いなく私にキャッシュの問題を疑わせることになります。次回は、Webサーバーのみを(正常に)再起動しようとします。これにより、キャッシュもクリアされます(php-正常なApacheの再起動でAPCがクリアされますか?-Stack Overflow

apc.stat = 1それ以外の場合は、 (http://php.net/manual/en/apc.configuration.php#ini.apc.stat)を設定/etc/php5/apache2php.iniすることも、ここで提案されているように良い考えのようです。新しい後にapache + APCを再起動する必要がありますか?アプリのバージョン展開?

アップデート

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

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

APCまたはAPCuif固有の機能を実行するための追加ブロック。

于 2014-10-02T20:58:23.040 に答える