1

我想做到这一点,以便在查询 db 的任何时候sfGuardUserProfile,它都会自动加入并与其相关的sfGuardUser.

如果我使用的是 Propel 1.2,我通常会重写类的doSelectStmt方法sfGuardUserProfilePeer来检查Criteria和修改它,以及修改类的hydrate方法sfGuardUserProfile。不过,我不确定如何在 Doctrine 中执行此操作。

4

2 回答 2

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);
    }   
  }
}

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

  class ProjectConfiguration extends sfProjectConfiguration
  {
    public function configureDoctrine(Doctrine_Manager $manager)
    {  
      $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
    }  
  }
于 2010-05-01T08:03:48.837 回答
1

尽管我同意 Coronatus 的观点,但我认为您想要做的事情可以通过以下方式实现:

http://www.symfony-project.org/plugins/sfGuardPlugin

请参阅“自定义 sfGuardUser 模型”。

基本上,配置文件需要被称为“sf_guard_user_profile”并建立关系,然后你应该能够使用:

$this->getUser()->getGuardUser()->getProfile();

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

于 2010-05-01T08:05:53.187 回答