在Entity Symfony2中创建自定义搜索


Create a custom search in Entity Symfony2

我是Symfony的新手,但我正在努力开发一个适合我工作的小型系统。

我只有ZF1的经验,我不习惯使用条令。但我需要为我的页面创建一个自定义查询,在互联网上搜索时,我发现当我生成一个新实体时,我可以创建一个在类名中具有相同名称+存储库的新实体。

例如,我有一个名为Schedule的实体和一个名为主ScheduleRepository

在我尝试生成自定义查询的ScheduleRepository中。

class ScheduleRepository extends EntityRepository
{
   public function findAll()
   {
      $rsm = new ResultSetMapping();
      # ScheduleType
      $rsm->addEntityResult( "ApplicationBundle'Entity'Schedule", "s" );
      $rsm->addFieldResult( "s", "schedule_id", "id" );
      $rsm->addFieldResult( "s", "usersId", "usersId" );
      $rsm->addFieldResult( "s", "updatedAt", "updatedAt" );
      $rsm->addFieldResult( "s", "start", "createdAt" );
      $rsm->addFieldResult( "s", "finish", "createdAt" );
      $rsm->addFieldResult( "s", "schedulesTypeId", "schedulesTypeId" );      
      # User
      $rsm->addJoinedEntityResult( "ApplicationBundle'Entity'User", "u", "s", "users" );
      $rsm->addFieldResult( "u", "users_id", "id" );
      $rsm->addFieldResult( "u", "name", "name" );
      $rsm->addJoinedEntityResult( "ApplicationBundle'Entity'ScheduleType", "st", "s", "scheduleType" );
      $rsm->addFieldResult( "st", "schedule_type_id", "id" );
      $rsm->addFieldResult( "st", "schedule_type_name", "name" );
      # custom SQL
      $sql = "SELECT
               s.id AS schedule_id,
               s.updated_at,
               st.id AS schedule_type_id,
               st.name AS schedule_type_name,
               u.id AS users_id,
               u.name,
               MAX( CASE WHEN s.schedules_type_id = 2 THEN s.created_at END ) AS start,
               MAX( CASE WHEN s.schedules_type_id = 2 THEN s.created_at END ) AS finish
             FROM
               schedules s
             INNER JOIN users u ON u.id = s.users_id
             INNER JOIN schedules_type st ON st.id = s.schedules_type_id
             GROUP BY 
               s.users_id,
               DATE_FORMAT( s.created_at, '%Y-%m-%d' ) 
             ORDER BY 
               DATE_FORMAT( s.created_at, '%Y-%m-%d' ) ASC";
      return $this->_em->createNativeQuery( $sql, $rsm )->getResult();
   }

当我转储退货时,我收到的是:

Schedule {#2187
  -id: 1
  -users: User {#2189
    -id: 1
    -name: "Felipe"
    -email: null
    -password: null
    -active: null
    -createdAt: null
    -updatedAt: null
    #schedule: PersistentCollection {#2190
      -snapshot: []
      -owner: User {#2189}
      -association: array:15 [ …15]
      -em: EntityManager {#2092 …10}
      -backRefFieldName: "users"
      -typeClass: ClassMetadata {#2101 …}
      -isDirty: false
      -initialized: false
      -coll: ArrayCollection {#2191
        -_elements: []
      }
    }
  }
  -scheduleType: ScheduleType {#2180
    -id: 1
    -name: "Entrada"
    #schedule: PersistentCollection {#2181
      -snapshot: []
      -owner: ScheduleType {#2180}
      -association: array:15 [ …15]
      -em: EntityManager {#2092 …10}
      -backRefFieldName: "scheduleType"
      -typeClass: ClassMetadata {#2101 …}
      -isDirty: false
      -initialized: false
      -coll: ArrayCollection {#2182
        -_elements: []
      }
    }
  }
  -createdAt: DateTime {#2188
    +"date": "2015-02-18 19:31:39"
    +"timezone_type": 3
    +"timezone": "UTC"
  }
  -updatedAt: null
}

我的问题是

  • 为什么我没有收到我在查询中创建的开始结束别名
  • 如果我在该字段中有值,为什么我的updatedAt为空

谢谢。

更新

我正在尝试用户[user3749178]:(https://stackoverflow.com/users/3749178/user3749178)说,使用这个库github.com/mapado/MysqlDoctrineFunctions,我再次生成查询,但在DQL中,现在我收到一个错误:

[Syntax Error] line 0, col 73: Error: Unexpected ')'

在这个DQL:

SELECT u, s, st, MAX(CASE WHEN s.schedulesTypeId = 2 THEN s.createdAt END) AS start FROM ApplicationBundle:Schedule s JOIN s.users u JOIN s.scheduleType st

  $rsm->addFieldResult( "s", "updatedAt", "updatedAt" );
  $rsm->addFieldResult( "s", "start", "createdAt" );
  $rsm->addFieldResult( "s", "finish", "createdAt" );

updatedAt应为updated_at。还请注意,您已将开始/结束都映射到同一字段。我怀疑终点会超过起点。既然你限制自己使用mysql,那么我建议你只使用camelBase作为别名,以减少混淆。

使用DQL可能会更好,但我认为你几乎做到了。

DQL仅支持以下sql函数:http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-功能

但是,您可以添加自己的。

http://symfony.com/doc/current/cookbook/doctrine/common_extensions.html

http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html