sfDoctrineGuard - 如何始终将sfGuardProfile加入sfGuardUser

pro*_*son 1 doctrine symfony1 join sfguard

我想这样做,以便任何时候查询数据库,sfGuardUserProfile它是自动连接和水合与其相关sfGuardUser.

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

Jak*_*las 8

您可以使用事件监听器.在教义文档中阅读有关它们的更多信息:事件监听器

在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);
    }   
  }
}
Run Code Online (Sandbox Code Playgroud)

要使其正常工作,您需要打开DQL回调.您可以在ProjectConfiguration类中执行此操作:

  class ProjectConfiguration extends sfProjectConfiguration
  {
    public function configureDoctrine(Doctrine_Manager $manager)
    {  
      $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
    }  
  }
Run Code Online (Sandbox Code Playgroud)