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

时间:2012-03-06 14:31:54

标签: php symfony twig redbean

我正在尝试让symfony的 Twig RedBean 很好地配合。

我可以显示顶级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.twig 里面,我可以轻松输出这个人的名字......

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

...但我想要访问的是关联的公司bean,就像这样......

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

如何在不需要额外的控制器/模型逻辑的情况下从树枝模板中执行此操作?

3 个答案:

答案 0 :(得分:4)

这显示了基本问题:

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-&gt;公司时,发生的事情就是公司很懒。在尝试加载公司属性之前,Twig会检查公司属性是否存在,但是找不到它。如果您取消注释$ person-&gt;公司行,那么测试通过,一切都会好。

我没有在RedBeans中看到任何允许急切加载的内容。您可以让您的控制器运行,并在每个人身上拨打$ person-&gt;公司。或者你可以尝试搞乱Twig_Template :: getAttribute();或者甚至可以使用查询并使用数组。

答案 1 :(得分:1)

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

我意识到OP并不想创建额外的模型功能,但这个解决方案至少需要4行 - 所以不是很多工作。

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

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

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

答案 2 :(得分:1)

试试这个:

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