我想做到这一点,以便在查询 db 的任何时候sfGuardUserProfile
,它都会自动加入并与其相关的sfGuardUser
.
如果我使用的是 Propel 1.2,我通常会重写类的doSelectStmt
方法sfGuardUserProfilePeer
来检查Criteria
和修改它,以及修改类的hydrate
方法sfGuardUserProfile
。不过,我不确定如何在 Doctrine 中执行此操作。
您可以使用事件侦听器。在教义文档中阅读有关它们的更多信息:事件侦听器
在 symfony 1.4 中可以修改 sfGuardUser。默认情况下,它位于 lib/model/doctrine/sfDoctrineGuardPLugin/sfGuardUser.class.php 中。您可以添加以下 preDqlSelect() 方法来修改查询。请注意,它未经测试。
class sfGuardUser extends PluginsfGuardUser
{
public function preDqlSelect($event)
{
$params = $event->getParams();
$query = $event->getQuery();
$alias = $params['alias'] . '.Profile';
if ((!$query->isSubquery() || ($query->isSubquery() && $query->contains(' ' . $params['alias'] . ' '))) && !$query->contains($alias))
{
$query->innerJoin($alias);
}
}
}
要使其正常工作,您需要打开 DQL 回调。您可以在 ProjectConfiguration 类中执行此操作:
class ProjectConfiguration extends sfProjectConfiguration
{
public function configureDoctrine(Doctrine_Manager $manager)
{
$manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
}
}
尽管我同意 Coronatus 的观点,但我认为您想要做的事情可以通过以下方式实现:
http://www.symfony-project.org/plugins/sfGuardPlugin
请参阅“自定义 sfGuardUser 模型”。
基本上,配置文件需要被称为“sf_guard_user_profile”并建立关系,然后你应该能够使用:
$this->getUser()->getGuardUser()->getProfile();
我认为某些配置文件需要正确的配置文件模型名称,但我可能错了。