Twig-如何在模板中原生显示RedBean关系


Twig - how to natively display RedBean relationships inside template?

我正试图让symfony的TwigRedBean玩得很好。

我可以显示顶级bean的数据,但不能显示它的任何关系。

我的意思是:

在我的控制器中,我以标准的方式调用Twig(有点伪代码):

// Controller
$vars = array(
    'people' = R::find('person')
);
return $this->app['twig']->render('index.twig',$vars);

我的bean的结构如下:

PERSON
->id
->first_name
->last_name
->company <-- (this represents a 'company' bean)
COMPANY
->id
->name

index.titch中,我可以很容易地像这样输出人名。。。

{% for person in people %}
    {{person.first_name}}
{% endfor %}

但我希望能够访问的是相关的公司bean,就像这样。。。

{% for person in people %}
    **{{person.company.name}}**
{% endfor %}

如何在不需要额外控制器/模型逻辑的情况下,从树枝模板内部实现这一点?

这显示了基本问题:

protected function testQuery()
{
    $persons = 'R::find('personx');
    foreach($persons as $person)
    {
        //$person->company;
        if ($person instanceof 'ArrayAccess && isset($person['company']))
        {
            echo 'Got Array' . "'n";
        }
        echo get_class($person) . ' ' . $person->name . ' ' . $person->company->name . "'n";
    }
}

现在的情况是,当你做$person->company时,公司是懒惰的。Twig在尝试加载之前检查公司属性的存在,但没有找到它。如果你取消对$person->company行的注释,那么测试就通过了,一切都会好起来。

我在RedBeans中没有看到任何允许急切加载的内容。你可以让你的控制器运行一遍,然后给每个人打电话给$person->company。或者,您可以尝试使用Twig_Template::getAttribute();或者甚至可以使用查询并使用数组。

请原谅我的死讯,但这是互联网上唯一一个关于这个问题的页面,我认为我有一个比公认答案更优雅的解决方案(在发布问题时可能不可能)。

我意识到OP不想创建额外的模型功能,但这个解决方案至少有4行,所以工作量不大。

我为我的bean创建了一个模型包装器,然后在open()方法中引用了相关的bean。当为相关表调用R::load()时,会自动调用open()。因此,对于OP的情况,该模型看起来如下:

class Model_Person extends RedBean_SimpleModel{
    public function open(){
        $this->ownCompany;
    }
}

简单地引用ownCompany就会触发延迟加载,这现在允许Twig访问该属性。

试试这个:

{% for person in people %}
    **{{person.__get('company').name}}**
{% endfor %}