I подумайте, что у вас есть проблема с безопасностью при загрузке .dll! Попробуйте это и дайте мне знать результат.
Чтобы узнать, какой файл php.ini был загружен, попробуйте выполнить следующее (запустите в командной строке и веб-сервере, чтобы убедиться, какая версия загружает другую среду).
Проверка пути файла php.ini:
<?php
$path = php_ini_loaded_file();
echo 'The loaded file path is :' . $path;
?>
Если вы знаете, сколько уровней может быть вложено, вы можете использовать Eager Loading. Скажем, если максимальная глубина составляет 3 уровня, вы можете сделать:
$model->with('parent.parent.parent');
Вы также можете использовать рекурсию вместо цикла.
public function getParentsAttribute()
{
if (!$this->parent) {
return collect([]);
}
return collect($this->parent->parents)->push($this->parent);
}
Если вы тоже хотите добавить первый объект (само), полный вызов будет:
$model->parents->push($model)->reverse->implode('attr_name', '/');
, который вы также можете включить в атрибут
public function getPathAttribute() {
return $model->parents->push($model)->reverse->implode('attr_name', '/');
}
[119 ] И звоните как $model->path;
После небольшого разговора в комментариях я думаю, что это хорошее решение:
// YourModel.php
// Add this line of you want the "parents" property to be populated all the time.
protected $appends = ['parents'];
public function getParentsAttribute()
{
$collection = collect([]);
$parent = $this->parent;
while($parent) {
$collection->push($parent);
$parent = $parent->parent;
}
return $collection;
}
Затем вы можете найти своих родителей, используя:
YourModel::find(123)->parents
(экземпляр коллекции ) YourModel::find(123)->parents->implode('yourprop', '/')
(развернуто в строку, см. https://laravel.com/docs/5.4/collections#method-implode ) YourModel::find(123)->parents->reverse()->implode('yourprop', '/')
( обратный порядок https://laravel.com/docs/5.4/collections#method-reverse ) Как отметил Николай Киселев https://stackoverflow.com / a / 55103589/1346367 Вы также можете комбинировать это с этим, чтобы сохранить несколько запросов:
protected $with = ['parent.parent.parent'];
// or inline:
YourModel::find(123)->with(['parent.parent.parent']);
Это предварительно загружает родителя при загрузке объекта. Если вы решите не использовать это, родительский (загружается) загружается, как только вы позвоните $yourModel->parent
.