我在api端点中有以下代码,该代码检查要删除的模型上是否没有关系(并返回true以表明它正在使用中):
控制器
public function destroy(Group $group)
{
if ($group->inUse()) {
return response(
['message' => 'This group cannot be deleted because it has either associated
catalogue items, users or organisations'],
409
);
}
$group->delete();
}
模型
public function inUse()
{
$models = [
'categories',
'items',
'organisations',
];
foreach ($models as $model) {
if (count($this->{$model}) > 0 ){
return true;
}
}
return false;
}
我不完全了解的一行是我们检查每种模型的关系数的位置:count($this->{$model})
I read on php.net,$ this-> {$ var}是一个变量变量,但在这里不是这种情况,循环的第一次运行将返回未定义的变量$ categories:
if($this->$categories) {
//
}
这是laravel功能还是特殊语法?我进行了快速搜索,但什么也没发现。
谢谢。
答案 0 :(得分:5)
其php语法,大括号用于动态调用对象属性,在您的情况下,它将翻译为:
if (count($this->categories) > 0 )
,if (count($this->items) > 0 )
...
答案 1 :(得分:1)
您正在调用给定模型上的属性-在检查记录数时,由关系表示的外观。
我相信您的$models
变量包含关系的名称
https://laravel.com/docs/5.7/eloquent-relationships
检查count
会建议他们返回Collection
的实例,您可能只使用$this->{$model}->count()
或$this->{$model}->isEmpty()
。
示例中的花括号是可选的,并且两者都是等效的:
$this->{$model}
$this->$model
与对字符串使用大括号相同:
"Some text {$array[0]}"
这些不是变量变量-如文档所述
变量变量采用变量的值并将其视为 变量的名称。
答案 2 :(得分:1)
如您在这里看到的,首先,它定义了一个列出要检查的关系的数组:
$models = [
'categories',
'items',
'organisations',
];
然后,它循环该数组以检查至少其中一个关系具有元素:
foreach ($models as $model) {
if (count($this->{$model}) > 0 ){
return true;
}
}
因此,如果我们采用数组的第一个元素:
echo $models[0] // 'categories'
在验证中:
foreach ($models as $model) {
// in this case, $model is 'categories'
// now it check if the relationship has elements:
// the following is equivalent to: if(count($this->{$model} > 0) {
if (count($this->categories) > 0 ){
return true;
}
}
...