Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create self referential relationship in laravel?

Tags:

laravel-4

I am new to Laravel. I Just want to create a self referential model. For example, I want to create a product category in which the field parent_id as same as product category id. How is this possible?

Model Shown below

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

It results Maximum function nesting level of '100' reached, aborting! Error

like image 827
Praveen Avatar asked Jan 04 '14 16:01

Praveen


People also ask

How many types of relationships are there in Laravel?

One To One (Polymorphic) One To Many (Polymorphic) Many To Many (Polymorphic)

How do you define a relationship in Laravel?

To define a relationship, we need first to define the post() method in User model. In the post() method, we need to implement the hasOne() method that returns the result. Let's understand the one to one relationship through an example. First, we add the new column (user_id) in an existing table named as posts.

How to define a relationship in Laravel?

We do this by using the belongsTo method. The next relationship that you can define in Laravel is a one to many relationship. This type of relationship means that one model of type A may be linked to multiple models of type B. But the model of type B belongs to only one model of type A.

Why does Laravel assume I have a passport_ID in my model?

By default Laravel will assume that you have a passport_id defined in the User model, since you try to create a relationship with the Passport model. Keep this in mind when creating migration files!

What is the has-many-through relationship in Laravel?

The "has-many-through" relationship provides a convenient way to access distant relations via an intermediate relation. For example, let's assume we are building a deployment platform like Laravel Vapor. A Project model might access many Deployment models through an intermediate Environment model.

How do I create a simple Laravel application?

To start, create a new Laravel project. I’ll name mine simple-referral. Allow composer or the laravel installer do its magic and you should have a barebones Laravel application at your fingertips. Configure the application database, run php artisan make:auth and let’s get cracking.


3 Answers

You can add a relation to the model and set the custom key for the relation field.

Update:

Try this construction

class Post extends Eloquent {

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

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

Old answer:

class Post extends Eloquent {

    function posts(){
        return $this->hasMany('Post', 'parent_id');
    }
}
like image 114
JackPoint Avatar answered Nov 25 '22 09:11

JackPoint


Your model is not at fault for producing the "maximum function nesting level of '100' reached" error. It's XDebug's configuration; increase your xdebug.max_nesting_level.

The following is from a 2015 post by @sitesense on laracasts.com:

This is not a bug in Laravel, Symfony or anything else. It only occurs when XDebug is installed.

It happens simply because 100 or more functions are called recursively. This is not a high figure as such and later versions of XDebug (>= 2.3.0) have raised this limit to 256. See here:

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

EDIT: In fact the latest Homestead provisioning script already sets the limit to 250. See line 122 here:

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

So the addition of xdebug.max_nesting_level = 250 to php.ini should do it.

like image 25
Sam Wilson Avatar answered Nov 25 '22 09:11

Sam Wilson


I've added a little more to the code based on your comments trying to access the parent!

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

Then you can access the parent from the child with eager loading, see more here: http://neonos.net/laravel-eloquent-model-parentchild-relationship-with-itself/

like image 41
Neo Avatar answered Nov 25 '22 09:11

Neo