sfDoctrineGuard - 如何始终将sfGuardProfile加入sfGuardUser

时间:2010-05-01 05:26:02

标签: join symfony1 doctrine sfguard

我想这样做以便随时sfGuardUserProfile查询数据库,它会自动加入并与其相关的sfGuardUser保持水合。

如果我使用的是Propel 1.2,我通常会覆盖doSelectStmt类的sfGuardUserProfilePeer方法来检查Criteria并根据需要进行修改以及修改hydrate sfGuardUserProfile类的方法。我不知道如何在Doctrine中这样做。

2 个答案:

答案 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();

我认为某些配置文件需要正确的配置文件模型名称,但我可能错了。