Подтвердить что ты не робот

Как создать самореферентные отношения в laravel?

Я новичок в Laravel. Я просто хочу создать самореляционную модель. Например, я хочу создать категорию продукта, в которой поле parent_id совпадает с идентификатором категории продукта. Как это возможно?

Модель, показанная ниже

class Product_category extends Eloquent 
{
    protected $guarded = array();

    public static $rules = array(
        'name' => 'required',
        'parent_id' => 'required'
    );

     function product_category()
    {
        return $this->belongsto('Product_category','parent_id');
    }
}

Результат: максимальный уровень вложенности функции "100" достигнут, прерывается! Ошибка

4b9b3361

Ответ 1

Вы можете добавить отношение к модели и установить настраиваемый ключ для поля отношения.

class Post extends Eloquent {

    function posts(){
        return $this->hasMany('Post', 'parent_id');
    }
}

ИЗМЕНИТЬ

Попробуйте эту конструкцию

class Post extends Eloquent {

    public function parent()
    {
        return $this->belongsTo('Post', 'parent_id');
    }

    public function children()
    {
        return $this->hasMany('Post', 'parent_id');
    }
}

Ответ 2

Ваша модель не виновата в том, что выдает ошибку "достигнут максимальный уровень вложенности функции" 100 "". Это конфигурация XDebug; увеличьте свой xdebug.max_nesting_level.

Следующее от публикации 2015 года @sitesense на laracasts.com:

Это не ошибка в Laravel, Symfony или чем-либо еще. Это происходит только тогда, когда XDebug установлен.

Это происходит просто потому, что 100 или более функций вызываются рекурсивно. Это невысокий показатель, и более поздние версии XDebug (> = 2.3.0) подняли этот предел до 256. Смотрите здесь:

http://bugs.xdebug.org/bug_view_page.php?bug_id=00001100

РЕДАКТИРОВАТЬ: На самом деле последний сценарий обеспечения Homestead уже устанавливает ограничение в 250. См. Строку 122 здесь:

https://github.com/laravel/settler/blob/master/scripts/provision.sh#L122

Поэтому добавление xdebug.max_nesting_level = 250 в php.ini должно сделать это.

Ответ 3

Я добавил еще немного кода, основываясь на ваших комментариях, пытаясь получить доступ к родителю!

class Person extends \Eloquent {
    protected $fillable = [];
    var $mom, $kids;

    function __construct() { 
        if($this->dependency_id<>0) {
            $this->mother->with('mother');  
        }
    }

    public function children() {
        $children = $this->hasMany('Person','dependency_id');
        foreach($children as $child) {
            $child->mom = $this;
        }
        return  $children;
    }

    public function mother() {
        $mother = $this->belongsTo('Person','dependency_id');
        if(isset($mother->kids)) {
            $mother->kids->merge($mother);
        }
        return $mother;
    }
}

Затем вы можете получить доступ к родителю от ребенка с энергичной загрузкой, см. Больше здесь: http://neonos.net/laravel-eloquent-model-parentchild-relationship-with-itself/