我正在使用FOSUserBundle,并创建了一个包含两列的消息表,这两列与来自FOSUserBundle的用户相关。
我想使用一个查询来获取关于作者的消息和信息。
下面是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')错误:“未知关系Authorid on the Acme\StoreBundle\Model\Message table”
我做错了什么?
谢谢你的帮助。
发布于 2013-03-21 16:45:18
好吧,我发现了。
作者和接收者的架构必须如下所示:
...
<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)
);messages (在细枝中)抛出上述所有字段和一个author对象(由于模式中的phpName,因此称为author,而不是user )。
感谢你们阅读我的问题,感谢你们的参与。
发布于 2013-03-20 22:56:36
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')
请参阅documentation of the foreign-key element。
https://stackoverflow.com/questions/15524611
复制相似问题