У меня есть следующий код в конечной точке 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})
Я читал на php.net, что $ this -> {$ var} является переменной переменной, но здесь этого не может быть, первое прохождение цикла вернет неопределенную переменную $ Categories:
if ($this->$categories) {
//
}
Это особенность Laravel или особый синтаксис? Я быстро поискал, но ничего не нашел.
Заранее спасибо.
Об этом можно прочитать здесь: Сложный (фигурный) синтаксис
@Remul Это строковая интерполяция, и я считаю, что это немного другое.
@DejavuGuy это было в кодовой базе, над которой я работаю - я продезинфицировал / изменил ее, чтобы скрыть важную для бизнеса информацию.
Я согласен, что это не совсем то, что вы ищете, но это единственное упоминание о доступе к свойствам объекта с помощью фигурных скобок на сайте php.net, которое я смог найти. Вы можете узнать больше об этом отвечать.
@Remul, да, моя беда, я тут совсем запутался, ты был прав насчет скобок!






Его синтаксис php, фигурные скобки, используемые для динамического вызова свойств объекта, в вашем случае это будет переведено как:
if (count($this->categories) > 0 ), if (count($this->items) > 0 ) ...
Я прочитал $ this -> {$ var} как $ this -> $ {$ var} - вот что меня сбивало с толку!
Вы вызываете свойство в данной модели - по внешнему виду, представленному отношением, когда вы проверяете количество записей.
Я считаю, что ваша переменная $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]}"
Это не переменные переменные - как указано в документации.
A variable variable takes the value of a variable and treats that as the name of a variable.
http://php.net/manual/en/language.variables.variable.php
Я думал, что фигурные скобки в $ this -> {$ var} означают переменную переменную - secure.php.net/manual/en/language.variables.variable.php. Я ожидал, что это вернет неопределенную ошибку переменной.
Они были бы, если бы вы включили $ перед скобками и использовали его как ссылку на переменную, то есть ${$var}, но вы имеете в виду внутреннее свойство данного объекта, $this->{$var} эквивалентно $this->$var - просто небольшой синтаксический сахар с скобками в Это дело.
Спасибо - я думаю, это то, из-за чего я спотыкаюсь!
Как вы можете видеть здесь, во-первых, он определяет массив, в котором перечислены отношения для проверки:
$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;
}
}
...
где ты нашел этот код?