2

我正在尝试让 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.twig里面,我可以很容易地输出这个人的名字......

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

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

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

如何从树枝模板内部执行此操作而无需额外的控制器/模型逻辑?

4

3 回答 3

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->company 时,公司是延迟加载的。Twig 在尝试加载之前检查公司财产是否存在,但没有找到。如果您取消注释 $person->company 行,则测试通过,一切都会好起来的。

我没有在 RedBeans 中看到任何允许预加载的内容。您可以让您的控制器运行并在每个人上调用 $person->company。或者你可以尝试弄乱 Twig_Template::getAttribute(); 或者甚至可以使用查询并使用数组。

于 2012-03-06T16:58:06.327 回答
1

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

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

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

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

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

于 2014-11-09T08:24:28.023 回答
1

试试这个:

{% for person in people %}
    **{{person.__get('company').name}}**
{% endfor %}
于 2017-05-01T15:01:43.840 回答