2012-03-06 49 views
1

我想要得到symfony的TwigRedBean搭配很好。树枝 - 如何在模板中本地显示RedBean关系?

我可以显示一个顶级bean的数据,但没有任何关系。

这里就是我的意思是:

在我的控制,我打电话嫩枝以标准方式(有些伪代码):

// Controller 
$vars = array(
    'people' = R::find('person') 
); 

return $this->app['twig']->render('index.twig',$vars); 

我豆类的结构如下:

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

COMPANY 
->id 
->name 

Inside index.twig,我可以很容易输出这样的人的名字...

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

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

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

我该怎么做,从一个树枝模板中,而不需要额外的控制器/模型逻辑?

+0

我还没有试过RedBeans S2内部,而且看起来它会工作。确认“echo $ person-> company-> name”给出了预期的结果。您的关系可能没有正确设置? – Cerad 2012-03-06 14:55:59

+0

它在控制器内部按预期工作......即echo $ person-> company-> name正常工作。它只是在TWIG文件中,它不是。我甚至设置了一个print_r过滤器({{person | print_r}}),并且树枝模板正确地将'person'var标识为RedBean_OODBBean对象...但person.company会变为null。很奇怪! – 2012-03-06 15:06:40

+1

Twig通过查找实际实例数据或方法名称来工作。 RedBeans将这些东西隐藏在神奇的方法背后。您可以尝试添加getCompany()自定义方法http://www.redbeanphp.com/manual/custom_getters,但我认为这不会有帮助。除了将人员bean包装到某种访问器对象之外,我真的没有看到一个解决方案。 – Cerad 2012-03-06 15:55:00

回答

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"; 
    } 
} 

正在发生的事情是,公司是延迟加载,当你做$人 - >公司。 Twig在尝试加载之前检查公司属性的存在,但没有找到它。如果您取消注销$ person-> company line,那么测试通过并且一切都会好的。

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

1

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

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

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

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

简单地引用ownCompany触发延迟加载,它现在允许嫩枝访问属性。

+0

那么$ person-> open()会在某处自动调用吗?自从原始帖子以来我没有看过redbean。只是好奇。 – Cerad 2014-11-11 14:51:10

+0

是的,只要在相关表上调用R :: load(),open()就会被调用。我已经更新了我的答案,以澄清这一点。 – Pickle 2014-11-11 18:35:07

+0

这是完美的我的目的,谢谢!在其他地方也找不到任何东西。 – mvuajua 2016-12-05 23:52:56

0

试试这个:

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

感谢您的回答;这是很久以前,我什至不记得PHP ... – 2017-05-01 18:54:51