Php 它是为了提供替代实现,下面是一个SQL实现: 类SqlEvents实现事件 { 私人部门$pdo; 公共函数构造(\PDO$PDO) { $this->pdo=$pdo; } /** *@return事件[] */ 公共函数findUserEvents(用户$User、$sort、$limit、数组$filters=[])) { //使用$this->pdo查询数据库 //您需要将结果转换为事件对象的集合 } }

Php 它是为了提供替代实现,下面是一个SQL实现: 类SqlEvents实现事件 { 私人部门$pdo; 公共函数构造(\PDO$PDO) { $this->pdo=$pdo; } /** *@return事件[] */ 公共函数findUserEvents(用户$User、$sort、$limit、数组$filters=[])) { //使用$this->pdo查询数据库 //您需要将结果转换为事件对象的集合 } },php,orm,repository-pattern,datamapper,dynamic-queries,Php,Orm,Repository Pattern,Datamapper,Dynamic Queries,简单。对于测试,您可以提供内存中的实现 依赖接口 每当您需要新的存储库时,请始终使用接口类型提示。这将允许您在感觉开始时选择的实现不再起作用时替换该实现 类MyController { 私人活动; 私人$view; 公共函数构造(事件$Events,视图$View) { $this->events=$events; } 公共函数列表操作(请求$Request) { $user=/。。。 $events=$this->events->findUserEvents($user'ASC',10); 返

简单。对于测试,您可以提供内存中的实现

依赖接口

每当您需要新的存储库时,请始终使用接口类型提示。这将允许您在感觉开始时选择的实现不再起作用时替换该实现

类MyController
{
私人活动;
私人$view;
公共函数构造(事件$Events,视图$View)
{
$this->events=$events;
}
公共函数列表操作(请求$Request)
{
$user=/。。。
$events=$this->events->findUserEvents($user'ASC',10);
返回$this->view->render('list.html',['events'=>$events]);
}
}
在本例中,MyController可以使用事件接口的任何实现。它不在乎这是信条、雄辩还是sql

选择实现


我个人倾向于使用教义。它将处理很多事情,比如水合对象或缓存。当您需要更好的性能时,您是否需要手动编写SQL查询?对于此特定查询,您始终可以这样做。并非所有的东西都需要以单一的方式实现,而且由于您与实现分离,因此很容易进行更改。

Uh-oh!我想这就是答案。这就是我的想法!那么过滤器的
部分是什么?我想要的列的列表?一些标志的列表(我将查找这些标志以决定
在哪里
)?我意识到我需要在每个查询上提供灵活性,但不是太多,因为这意味着我需要将其拆分为另一个存储库方法。我想我可以有一个
查询类
,它具有我可以发送到Repo->方法的所有潜在属性,如您在这里所示(即排序、限制、列选择…)。但不应将此类误认为是查询生成器。这只是一个组织,我将如何与回购->方法进行沟通。每个Repo->方法都应该有某种方式来实现对该通信的约束。就像我不能传递任何我的Repo->方法不允许的
列来选择
(查询最终不允许)。我不应该传递我的Repo->方法不会响应的标志。我想只需要关于每个Repo->方法的好文档,让开发人员知道可以传递什么来操作特定Repo->方法的查询。最后的想法?(在我接受这个答案之前)我只添加了$filters,因为您在问题中使用了它。我会限制参数的数量并使方法更具体(如findEnrolledUserEvents())。至于要加载哪些字段,我并不担心,因为对于条令,您可以在您的方法中选择它们,它仍然会生成一个适当的对象(延迟加载未使用的字段,这是需要注意的)。
SELECT users.first_name, users.last_name, events.name, events.date, venues.name,
venue_types.name, GROUP_CONCAT(user_friends.last_name) as 'friends'
FROM users 
JOIN events ON(events.id = users.event_id AND events.date = :date)
JOIN etc....