【问题标题】:sfDoctrineGuard - how to ALWAYS join sfGuardProfile to sfGuardUsersfDoctrineGuard - 如何始终将 sfGuardProfile 加入 sfGuardUser
【发布时间】:2010-05-01 05:26:02
【问题描述】:

我想让它随时查询数据库以获取sfGuardUserProfile,它会自动加入并与其相关的sfGuardUser 水合。

如果我使用 Propel 1.2,我通常会覆盖 sfGuardUserProfilePeer 类的 doSelectStmt 方法以检查 Criteria 并根据需要对其进行修改,以及修改 sfGuardUserProfile 类的 hydrate 方法.不过,我不确定如何在 Doctrine 中执行此操作。

【问题讨论】:

  • 每个人都有自己的。我从第一个稳定版开始就一直在使用 sfGuard,它对我有用。我想可能有两次它不符合我的要求,我从头开始写了一些东西来替换它。

标签: join symfony1 doctrine sfguard


【解决方案1】:

您可以使用事件侦听器。在教义文档中阅读有关它们的更多信息: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);
    }  
  }

【讨论】:

  • 这似乎是我一直在寻找的......欢迎来到 Stack Overflow :-)
【解决方案2】:

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

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

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

基本上,配置文件需要称为“sf_guard_user_profile”并建立关系,然后您应该可以使用:

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

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

【讨论】:

  • 好吧,您可以自定义模型名称...是的,这将开箱即用以检索配置文件,但是如果在查询时未手动加入,它将发出单独的查询以获取配置文件对象- 我试图使连接自动(基本上关闭配置文件模型的延迟加载,而不是其他。
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多