使用FOSUserbundle推进和相关数据

时间:2013-03-20 13:14:45

标签: symfony join foreign-keys propel fosuserbundle

我正在使用FOSUserBundle,我创建了一个包含两列的Message表,这些列与FOSUserBundle中的User相关。

我想使用一个查询获取有关作者的消息和信息。

关注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”

我做错了什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分: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)
    );

在这个简单的代码之后,我可以访问twig中的所有内容。

此时我想展示一个例子:

当控制器如上所示时,

# 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 

正如您所看到的,没有关于与作者或收件人的关系,但是当我调用message.author.username或message.recipient.username(在消息的for循环中)时,我得到了这个。这就是我的期望。

现在当控制器看起来像:

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

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

消息(在twig中)抛出上面的所有字段和一个作者对象(称为作者,而不是用户,因为来自模式的phpName)。

感谢大家阅读我的问题和很多参与者。

答案 1 :(得分:1)

join方法使用表或phpName别名而不是字段来获取关系。所以你可能想要:

->join("Message.Author")

或者,正如你的外键暗示的那样,也许这个?

->join("Message.FosUser")

<强>更新

对同一个表使用两个FK引用,您将需要使用外键标记的phpNamerefPhpName属性:

<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')

请参阅documentation of the foreign-key element