我正试图让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.titch中,我可以很容易地像这样输出人名。。。
{% for person in people %}
{{person.first_name}}
{% endfor %}
但我希望能够访问的是相关的公司bean,就像这样。。。
{% 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";
}
}
现在的情况是,当你做$person->company时,公司是懒惰的。Twig在尝试加载之前检查公司属性的存在,但没有找到它。如果你取消对$person->company行的注释,那么测试就通过了,一切都会好起来。
我在RedBeans中没有看到任何允许急切加载的内容。你可以让你的控制器运行一遍,然后给每个人打电话给$person->company。或者,您可以尝试使用Twig_Template::getAttribute();或者甚至可以使用查询并使用数组。
请原谅我的死讯,但这是互联网上唯一一个关于这个问题的页面,我认为我有一个比公认答案更优雅的解决方案(在发布问题时可能不可能)。
我意识到OP不想创建额外的模型功能,但这个解决方案至少有4行,所以工作量不大。
我为我的bean创建了一个模型包装器,然后在open()
方法中引用了相关的bean。当为相关表调用R::load()
时,会自动调用open()
。因此,对于OP的情况,该模型看起来如下:
class Model_Person extends RedBean_SimpleModel{
public function open(){
$this->ownCompany;
}
}
简单地引用ownCompany
就会触发延迟加载,这现在允许Twig访问该属性。
试试这个:
{% for person in people %}
**{{person.__get('company').name}}**
{% endfor %}