我想这样做以便随时为sfGuardUserProfile
查询数据库,它会自动加入并与其相关的sfGuardUser
保持水合。
如果我使用的是Propel 1.2,我通常会覆盖doSelectStmt
类的sfGuardUserProfilePeer
方法来检查Criteria
并根据需要进行修改以及修改hydrate
sfGuardUserProfile
类的方法。我不知道如何在Doctrine中这样做。
答案 0 :(得分:8)
您可以使用事件监听器。在教义文档中阅读有关它们的更多信息:Event Listeners
在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);
}
}
答案 1 :(得分:1)
虽然我同意Coronatus,但我认为您的目标可以通过以下方式实现:
http://www.symfony-project.org/plugins/sfGuardPlugin
请参阅“自定义sfGuardUser模型”。
基本上,需要将配置文件称为“sf_guard_user_profile”并设置关系,然后您应该可以使用:
$this->getUser()->getGuardUser()->getProfile();
我认为某些配置文件需要正确的配置文件模型名称,但我可能错了。