在Laravel 5中,它的作用是:$ this-> {$ var}

时间:2018-11-19 14:07:12

标签: php laravel

我在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功能还是特殊语法?我进行了快速搜索,但什么也没发现。

谢谢。

3 个答案:

答案 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]}"

这些不是变量变量-如文档所述

  

变量变量采用变量的值并将其视为   变量的名称。

http://php.net/manual/en/language.variables.variable.php

答案 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;
    }
}
...