Php 无法访问细枝上的雄辩属性
我正在尝试使用Slim中的Twig访问一个有说服力的属性,但得到了一个错误 我有一个字段和一个类型对象,关系如下Php 无法访问细枝上的雄辩属性,php,eloquent,twig,slim,Php,Eloquent,Twig,Slim,我正在尝试使用Slim中的Twig访问一个有说服力的属性,但得到了一个错误 我有一个字段和一个类型对象,关系如下 class Field extends \Illuminate\Database\Eloquent\Model { protected $table = 'fields'; public function type() { return $this->belongsTo('models\Type'); } 当执行{{f}}(作为一个字段)时,输出如下: {"fie
class Field extends \Illuminate\Database\Eloquent\Model {
protected $table = 'fields';
public function type()
{
return $this->belongsTo('models\Type');
}
当执行{{f}}
(作为一个字段)时,输出如下:
{"field_id":"1","field_name":"Your name","form_id":"2","type_id":"1","placeholder":"Please give us your name"}
当执行{{f.type}}
时,结果是:
消息:在第97行的“pages/editform.html”中呈现模板(“类对象Illumb\Database\Eloquent\Relations\BelongsTo无法转换为字符串”)时引发异常
如果我尝试执行{{f.type.name}
,不会抛出异常,但也不会打印任何内容
如果我用PHP做的话
$fields = $form->fields;
var_dump($fields[0]->type->name);
该值得到正确的输出
有什么想法吗?,
谢谢我也有同样的问题,偶然发现了这个问题。我自己解决了之后,我想我会尽力帮你的 尝试在模型上执行快速加载:
Field::with('type')->get()
这将允许您在没有其他问题的情况下执行以下操作
{{ f.type }}
请参阅此处的更多信息:如果您不想进行快速加载,您可以覆盖
字段
类中的magic\uu isset
方法,以返回类型
关系属性的true
:
public function __isset($name)
{
if (in_array($name, [
'type'
])) {
return true;
} else {
return parent::__isset($name);
}
}
解释
问题在于Eloquent如何实现关系的“动态属性”(在您的例子中为f.type
),以及Twig用于访问变量“属性”的规则之间的交互
从Twig文档中:
为了方便起见,foo.bar
在PHP层上执行以下操作:
- 检查
是否为数组和foo
是否为有效元素李>bar
- 如果不是,并且如果
是一个对象,请检查foo
是否为有效属性李>bar
- 如果不是,并且如果
是一个对象,请检查foo
是否是有效的方法(即使bar
是构造函数-使用bar
)李>\u construct()
- 如果不是,并且如果
是对象,请检查foo
是否为有效方法李>getBar
- 如果不是,并且如果
是一个对象,请检查foo
是否为有效方法李>isBar
- 如果不是,则返回空值
- 检查
是否为数组和foo
是否为有效元素李>bar
- 如果不是,则返回空值
$f->type
上调用isset
。雄辩,所以你可能认为这不会是个问题
但是,请看一下它是如何实际实现模型关系的\uu isset
:
/**
* Determine if an attribute exists on the model.
*
* @param string $key
* @return bool
*/
public function __isset($key)
{
return (isset($this->attributes[$key]) || isset($this->relations[$key])) ||
($this->hasGetMutator($key) && ! is_null($this->getAttributeValue($key)));
}
它通过查看已加载关系的数组(isset($this->relations[$key])
)来确定关系是否已“设置”。问题是如果类型
尚未加载,Eloquent会说它未“设置”
因此,当Twig查看$f->type
时,它会认为type
不是有效的属性,并继续下一个规则:
…如果foo
是对象,请检查bar
是否为有效方法
现在,它将查找找到的方法type()
。唯一的问题是什么type()。和属于对象
对象不是模型
如果您想让Twig知道属性$f->type
确实存在,您有两个选择:
- 您可以按照@roger collins的建议,将相关的
类型
对象与字段一起加载,或者李>
- 您可以在
字段中重载\u isset
魔术方法:
公共函数集($name)
{
if(in_数组($name[
“类型”
])) {
返回true;
}否则{
返回父项::__isset($name);
}
}
这将迫使Twig认识到类型
是字段
的有效属性,即使在相关模型实际加载之前也是如此。我真的不知道Twig,但出于某种原因,它似乎调用了函数,而不是让Laravel执行它的魔法。你可以试试这个:{{f.type.name.get()}}
不起作用,因为现在我不得不求助于:公共函数getTypeString(){$type=type::find($this->type\id);return$type->name;}
很有魅力,很有趣的概念值得学习,非常感谢!现在我明白了!谢谢各位。仅供参考,isset
代码中的小错误。在类型之后缺少)
:]){