1

私はエンティティを使用していくつかのfindByに苦労してきましたが、何が悪いのか本当に理解できません。

私はこれらの2つのクラスを使用しています:

GPos_Model_Product

/**
* @Entity
* @Table(name="Product")
*/
class GPos_Model_Product extends GPos_Doctrine_ActiveEntity {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
    protected $id;

    /**
     * @ManyToOne(targetEntity="GPos_Model_Store")
     * @JoinColumn(name="store_id", referencedColumnName="id")
     **/
    protected $store;
}

GPos_Model_Store

/**
 * @Entity
 * @Table(name="Store")
 */
class GPos_Model_Store extends GPos_Doctrine_ActiveEntity {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
    protected $id;

    /** @Column(name="status", type="string", columnDefinition="enum('active', 'deleted')")  */
    protected $status = 'active';
}

注:読みやすくするために、両方のクラスの不要なフィールドを削除しました

問題は次のとおりです。コントローラーの1つで、特定のストアにリンクされているすべての商品を取得しようとしています。

public function indexAction() {
    $this->_helper->getHelper('layout')->disableLayout();
    $authNamespace = new Zend_Session_Namespace('Zend_Auth');

    //get store's products list.
    $store = GPos_Model_Store::find($authNamespace->store);
    var_dump($store); //prints store successfully.
    //next line throws an unusable exception talking about layout.phtml not found...
    $products = GPos_Model_Product::findByStore($store->getId());
    //give it to the view for the products list rendering.
    var_dump($products);
    $this->view->products = $products;
}

奇妙なこと$products = GPos_Model_Product::findByStore($store);に、代わりに使用すると、例外は発生しませんが、結果として単に空の配列になります。同じ関係を持ち、正常に機能する他の2つのエンティティについて、別のコントローラーでまったく同じ方法(getId()を使用)を使用しました。

DBを確認しましたが、パラメーターとして使用しているストアは実際にいくつかの製品にバインドされています。つまり、結果として空の配列も正しくありません。8つの製品の配列を取得する必要があります...

正常に動作している他のコントローラーのコードは次のとおりです(コードを再度絞り込みました)。

$user = GPos_Model_User::findOneByLogin($form->getValue('login'));
$contact = GPos_Model_Contact::findByUser($user->getId());
//these lines work perfectly and I'm receiving an array of `GPos_Model_Contact` entities... 

これらの2組のエンティティはまったく同じ方法で宣言されているので、実際にはわかりません...

ご協力いただきありがとうございます!

4

1 に答える 1

1

うん!

私は自分の間違いを見つけました...それは実際には私の関係とは何の関係もありませんでした。
私の間違いは、gedmoを使用していて、デフォルトのロケールを設定するのを忘れたということでした。つまり、どこを見ればよいかわからなかったため、製品を取得できなかったということです。Gedmoは例外をスローしていましたが、layout not found例外によってオーバーライドされました(これは、私のレイアウトに問題がなかったため、一種のzendバグです)。

XDebugと数時間の忍耐力のおかげで、私はついに正確な例外メッセージを見つけて、数分で修正することができました。

とにかく注意を払ってくれた人に感謝します、これは実際にはうまく設定されていると思ったので、(gedmoのもので)十分なコードを提供しなかったのは私のせいでした...

于 2012-05-11T10:11:58.597 に答える