33

Country (id, name) と Mapping (id, object, internalId, externalId) の 2 つのエンティティがあります。Country と Mapping は関連付けで接続されていません (Mapping には国以外の行があるため)。次の条件を使用して、国の外部 ID を取得する必要があります。

  • country.id = mapping.internalId
  • mapping.object = 'country'

そこで、関数 getExternalId() を Country に追加する予定です

function getExternalId() {
    $em = Registry::getEntityManager();

    $mapping = $em->getRepository('Mapping')->findOneBy(array(
        'object'     => 'country',
        'internalId' => $this->getId()
    ));

    return !empty($mapping) ? $mapping->getExternalId() : false;
}

質問:

  1. エンティティ内で EntityManager を使用することをお勧めしますか? いいえの場合、私の場合に外部 ID を取得する方法を説明してください。
  2. yaml ファイルを使用して Country と Mapping を関連付けることは可能でしょうか?

前もって感謝します!

4

4 に答える 4

52

エンティティ オブジェクトがエンティティ マネージャに依存できるようにすることはお勧めできません。Doctrine 2 が具体的に解決しようとしていた問題であった永続層にエンティティを結び付けます。エンティティ マネージャーに依存する際の最大の問題は、モデルをデータベースから切り離してテストすることが難しくなることです。

エンティティ マネージャーに依存する操作を処理するには、おそらくサービス オブジェクトに依存する必要があります。

// CountryService
public function getExternalId($country) {}

さらに、モデルにプロキシ メソッドを作成して、外部で設定されたサービス オブジェクトを呼び出すこともできます。サービス オブジェクトは、エンティティ マネージャーよりもテスト中にモックする方がはるかに簡単です。

$country->setService($countryService);
$country->getExternalId();

// Country
public function getExternalId()
{
   $this->_service->getExternalId($this);
}  
于 2010-11-05T19:47:37.330 に答える
9

使用する必要があるのはエンティティ リポジトリだと思います。これらについては、ドキュメントで詳しく説明されていますが、情報を見つけるのは少し難しいです。これは、エンティティの「アクセス」関数の「リポジトリ」を作成する方法を説明した入門記事へのリンクです。

さらに、ここにいくつかの疑似コードを示します。

<?php
// repositories/CountryRepository.php

use Doctrine\ORM\EntityRepository;

class CountryRepository extends EntityRepository
{
    public function getExternalId()
    {
于 2011-10-18T19:17:40.163 に答える
1

これに対する少し最先端の補遺 (この記事の時点で PHP 5.4 はアルファ 2 です) は、将来的に役立つ可能性があります。

Doctrine2 内で php 5.4 トレイトを使用する例をいくつか示します。そのうちの 1 つはアクティブ エンティティと呼ばれ、エンティティ内からのエンティティ マネージャーへのアクセスを含め、Doctrine 2 内でアクティブ レコード スタイル機能を提供します。

于 2011-10-31T18:35:42.920 に答える