树枝 - 如何在模板中本地显示RedBean关系?
我想要得到symfony的Twig与RedBean搭配很好。树枝 - 如何在模板中本地显示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 %}
我该怎么做,从一个树枝模板中,而不需要额外的控制器/模型逻辑?
这显示了基本的问题:
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();或者甚至可以使用查询并使用数组。
原谅我的necro发布,但这是互联网上关于这个问题的唯一网页,我认为我有一个比接受的答案更优雅的解决方案(这可能在问题发布时是不可能的)。
我意识到OP不想创建额外的模型功能,但这个解决方案至少有4行 - 所以没有太多的工作。
我为我的bean创建了一个模型包装器,然后在open()
方法中引用了相关的bean。当R::load()
被调用用于相关表时,open()
被自动调用。所以对于OP的情况下,该模型将如下所示:
class Model_Person extends RedBean_SimpleModel{
public function open(){
$this->ownCompany;
}
}
简单地引用ownCompany
触发延迟加载,它现在允许嫩枝访问属性。
试试这个:
{% for person in people %}
**{{person.__get('company').name}}**
{% endfor %}
感谢您的回答;这是很久以前,我什至不记得PHP ... – 2017-05-01 18:54:51
我还没有试过RedBeans S2内部,而且看起来它会工作。确认“echo $ person-> company-> name”给出了预期的结果。您的关系可能没有正确设置? – Cerad 2012-03-06 14:55:59
它在控制器内部按预期工作......即echo $ person-> company-> name正常工作。它只是在TWIG文件中,它不是。我甚至设置了一个print_r过滤器({{person | print_r}}),并且树枝模板正确地将'person'var标识为RedBean_OODBBean对象...但person.company会变为null。很奇怪! – 2012-03-06 15:06:40
Twig通过查找实际实例数据或方法名称来工作。 RedBeans将这些东西隐藏在神奇的方法背后。您可以尝试添加getCompany()自定义方法http://www.redbeanphp.com/manual/custom_getters,但我认为这不会有帮助。除了将人员bean包装到某种访问器对象之外,我真的没有看到一个解决方案。 – Cerad 2012-03-06 15:55:00