1

私は FOSUserBundle を使用しており、FOSUserBundle のユーザーに関連する 2 つの列を持つメッセージ テーブルを作成しました。

1 つのクエリを使用して、著者に関するメッセージと情報を取得したいと考えています。

以下の schema.xml:

<?xml version="1.0" encoding="UTF-8"?>

<database name="default" namespace="Acme\StoreBundle\Model" defaultIdMethod="native">

<table name="message">
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
    <column name="title" type="varchar" size="64" required="true" defaultValue="(untitled)"/>
    <column name="content" type="longvarchar" />
    <column name="author_id" type="integer" required="true" />
        <foreign-key foreignTable="fos_user">
            <reference local="author_id" foreign="id" />
        </foreign-key>
    <column name="recipient_id" type="integer" required="true" />
        <foreign-key foreignTable="fos_user">
            <reference local="recipient_id" foreign="id" />
        </foreign-key>
</table>
</database>

私は多くのオプションを試していましたが、結果はありませんでした。

私が試してみると、論理的と思われるもの:

$messages = MessageQuery::create()
            ->join('Message.Authorid')
            ->findByRecipientId(1);

次のエラーが表示されます:「不明なテーブルまたはエイリアス メッセージ」

と:

->join('Authorid')

エラー: 「Acme\StoreBundle\Model\Message テーブルの不明な関係 Authorid」

私は何を間違っていますか?

ご協力ありがとうございました。

4

2 に答える 2

3

わかりました、私はそれを見つけました。

作成者と受信者の両方のスキーマは次のようにする必要があります。

...
<column name="author_id" type="integer" required="true" />
    <foreign-key foreignTable="fos_user" phpName="Author">
        <reference local="author_id" foreign="id" />
    </foreign-key>

<column name="recipient_id" type="integer" required="true" />
    <foreign-key foreignTable="fos_user" phpName="Recipient">
        <reference local="recipient_id" foreign="id" />
    </foreign-key>
...

重要な部分は phpName です。

これでコントローラー。そして、ここで奇妙なことが起こりますが、邪魔にはなりません。

$messages = MessageQuery::create()
    ->find();

return $this->render('AcmeStoreBundle:Message:index.html.twig',
        array('messages' => $messages)
    );

そして、この簡単なコードの後、小枝からすべてにアクセスできます。

この時点で、例を示したいと思います。

コントローラーが上記のようになったら、

# AcmeStoreBundle:Message:index.html.twig

messages

次のようなメッセージ テーブルのすべてのフィールドを表示します。

Acme\StoreBundle\Model\Message_0: Id: 1 CreatedAt: !!php/object:O:8:"DateTime":3:    {s:4:"date";s:19:"2013-03-20 13:00:00";s:13:"timezone_type";i:3;s:8:"timezone";s:12:"Europe/Paris";} Title: (untitled) Content: 'test content' AuthorId: 1 RecipientId: 2 Acme\StoreBundle\Model\Message_1: Id: 2 CreatedAt: !!php/object:O:8:"DateTime":3:{s:4:"date";s:19:"2013-03-20 13:15:22";s:13:"timezone_type";i:3;s:8:"timezone";s:12:"Europe/Paris";} Title: (untitled2) Content: 'bla bla content 2' AuthorId: 2 RecipientId: 1 

ご覧のとおり、作成者または受信者との関係については何もありませんが、(メッセージの for ループで) message.author.username または message.recipient.username を呼び出すと、これが得られます。そして、これは私が実際に期待したことです。

そして今、コントローラーが次のようになったら:

$messages = MessageQuery::create()
        ->joinWith('Author')
        ->find();

return $this->render('AcmeStoreBundle:Message:index.html.twig',
        array('messages' => $messages)
    );

(twig の)messages は、上記のようなすべてのフィールドと、作成者オブジェクト(スキーマの phpName のため、ユーザーではなく作成者と呼ばれます)をスローします。

私の質問を読んでくれてありがとう、そして参加してくれてありがとう。

于 2013-03-21T08:45:17.537 に答える
1

このjoinメソッドは、フィールドではなく、テーブルまたは phpName エイリアスを使用して関係を取得します。だからあなたはおそらく欲しい:

->join("Message.Author")

または、あなたの外部キーが示唆するように、おそらくこれですか?

->join("Message.FosUser")

アップデート

同じテーブルへの 2 つの FK 参照がある場合、foreign-key タグのphpNameおよび属性を使用する必要があります。refPhpName

<table name="message">
  ...
  <foreign-key foreignTable="fos_user" phpName="Author" refPhpName="AuthoredMessage">
    <reference local="author_id" foreign="id" />
  </foreign-key>
  <foreign-key foreignTable="fos_user" phpName="Recipient" refPhpName="ReceivedMessage">
    <reference local="recipient_id" foreign="id" />
  </foreign-key>
</table>

->join('Message.Author')次に、またはを使用してみてください->join('Message.Recipient')

外部キー要素のドキュメントを参照してください。

于 2013-03-20T14:56:35.510 に答える