我正在尝试让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 %}
如何在不需要额外的控制器/模型逻辑的情况下从树枝模板中执行此操作?
答案 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 %}