如何在laravel中建立自我参照关系?

时间:2014-01-04 16:49:19

标签: laravel-4

我是Laravel的新手。我只想创建一个自引用模型。例如,我想创建一个产品类别,其中字段parent_id与产品类别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'的最大功能嵌套级别,正在中止!错误

4 个答案:

答案 0 :(得分:54)

您可以为模型添加关系,并为关系字段设置自定义键。

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');
    }
}

答案 1 :(得分:8)

您的模型不会产生" 100' 100的最大功能嵌套级别。达到"错误。这是XDebug的配置;增加xdebug.max_nesting_level

以下内容来自laracasts.com上的a 2015 post @sitesense:

  

这不是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应该这样做。

答案 2 :(得分: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/

答案 3 :(得分:0)

您可以使用$ this

来介绍自己
class Post extends Eloquent {

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