我正在使用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”
我做错了什么?
感谢您的帮助。
答案 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引用,您将需要使用外键标记的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')