Php 在Spot ORM中使用with()

Php 在Spot ORM中使用with(),php,orm,Php,Orm,我正在用它做一个辅助项目。在文档中是这样写的 默认情况下,所有关系类型都是延迟加载的,可以使用with方法立即加载以解决N+1查询问题: $posts=$posts->all()->带有('comments') 但是,实体没有此方法,我只能在Mapper类中找到它,但它受到保护(因此不可用)。我应该如何实现即时加载?通常 从: 由于Spot遵循DataMapper设计模式,因此需要一个mapper实例来处理对象实体和数据库表 映射器只能使用一种实体类型,因此每个使用的实体类都需要一个映射器(即,

我正在用它做一个辅助项目。在文档中是这样写的

默认情况下,所有关系类型都是延迟加载的,可以使用with方法立即加载以解决N+1查询问题:

$posts=$posts->all()->带有('comments')

但是,实体没有此方法,我只能在Mapper类中找到它,但它受到保护(因此不可用)。我应该如何实现即时加载?

通常
从:

由于Spot遵循DataMapper设计模式,因此需要一个mapper实例来处理对象实体和数据库表

映射器只能使用一种实体类型,因此每个使用的实体类都需要一个映射器(即,要保存实体\帖子,您需要相应的映射器;要保存实体\评论,您需要的是评论映射器,而不是相同的帖子映射器。关系将由相应的映射器按点自动加载和处理

这意味着您必须为实体使用
Mapper

虽然您不必为每个实体创建映射器,但如果您有许多自定义查找器方法,或者希望有一个更好的位置来包含构建所有所需查询的逻辑,那么有时创建一个映射器是很好的

这意味着您可以创建自己的
映射器
扩展(非必需),如果您需要特定的功能。除非您需要特定的逻辑,如查找器方法或其他自定义逻辑,Spot将为您加载通用映射器并返回它

因此,请使用您自己的或通用的
Mapper
并从那里使用
with()
方法。请注意,受保护的字段并不意味着它不可用。它只是意味着拥有
Mapper
作为其父级的类也会获得
with()
方法,而
with()
方法仍然是“私有的”因此,在课堂外无法联系到它。
正如您链接的类中指定的那样,
with()
方法受到保护,并带有以下注释:

 /**
* Eager-load associations for an entire collection
*
* @internal Implementation may change... for internal use only
*/
您可以看到它仅指定为内部使用。请注意,这并不意味着它不能使用,它可以,但只能在
Mapper
类中使用。在
Mapper
类中还有其他方法使用
with()

您的报价

您链接到的特定部分似乎相互矛盾,因为它看起来像是指一个
实体
,但我认为它是一个自定义
映射器

如果您将此视为您的代码> POST <代码> <代码>实体< /代码>:

namespace Entity;
class PostEntity extends \Spot\Entity
{
    protected static $mapper = 'Entity\Mapper\PostMapper';
    // ... snip ...
}
还有另一个扩展自
Mapper

namespace Entity\Mapper;
use Spot\Mapper;
class PostMapper extends Mapper
{

    //other methods

    //example method
    /**
    * Get 10 most recent posts for display on the sidebar
    *
    * @return \Spot\Query
    */
    public function mostRecentPostsForSidebar()
    {
        return $this->where(['status' => 'active'])
            ->order(['date_created' => 'DESC'])
            ->limit(10);
    }

    //other methods
}
您现在已经从
Mapper
进行了扩展,因此现在可以使用
with()
方法。
PostMapper
中,您可以执行以下操作:

//Pseudocode
public function some_method()
{
    //Some code
    $this->with($collection, $entityName, $with);
    //Some code
}

请注意,
PostEntity
中也有
PostMapper
(作为
静态
字段)。希望您现在更清楚。也许他们应该在文档的那部分指定它使用的是自定义的
映射器

,如果它受到保护,并不意味着它不可用。如果您引用的类是
抽象的
,则您必须从中扩展:(另外,该函数使其读起来像是可以开箱即用。您希望在哪个类上使用
with()
函数?我假设不是
映射器
类,因为您指出它是唯一具有这些函数的类。这实际上是我的问题,我应该在哪个类上使用它?:(谢谢,这有点令人失望,但我还是要说:这是像
PostMapper
这样的命名法可能会有所帮助的地方。@donquixote是的,我不知道为什么我保留了这些名字……我想我一定是从他们的示例代码中选取了它们,不想把任何事情弄糟。我已经更新了它,希望现在它更清晰一些。谢谢f。)或是抬起头来。