欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

关联自己 laravel table relation self


How to create self referential relationship in laravel?


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

shareimprove this question

正确答案 
You can add a relation to the model and set the custom key for the relation field.

class Post extends Eloquent {

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

EDIT

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

来自  http://stackoverflow.com/questions/20923773/how-to-create-self-referential-relationship-in-laravel



I have set up the relationship and the models as below:

pivot table schema

Schema::create('friend_user', function(Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->integer('friend_id')->unsigned();
    $table->timestamps();
});

pivot table seeder (this defines two 'friendships' to which user '1' belongs one where user 1 is specified in the user_id and the second where user 1 is listed in the friend id):

    $friend_user = array(
        array(
            'id' => 1,
            'user_id' => 1,
            'friend_id' => 3,
        ),
        array(
            'id' => 2,
            'user_id' => 4,
            'friend_id' => 1,
        ),

    );

User model

public function friends()
{
 return $this->belongsToMany('User', 'friend_user', 'user_id', 'friend_id');
}

This is as suggested by Taylor Otwell here: https://github.com/laravel/framework/issues/441

This all works but when I run the following command I get only one result:

foreach(Auth::user()->friends as $i) {
    var_dump($i->id);
}

This returns the value '3' but not 4 as expected. I understand why this is happening (as the user_id is not the friend_id) but how can I get this to return a collection of all friends belonging to a user (ie all friendships) regardless of which end of the connection (user_id or friend_id) the user is?

shareimprove this question
 
   
you onlu have 2 relations in your seeder, one for two different users. So your function is only going to return one result for each of those users? – The Shift Exchange Jul 10 '13 at 10:53
   
Yes, but the friend_id on the second record is the id of user 1 so both entries define a friendship, it just happens that one was initiated by one user and the other by the second user. I'm trying to work out how to return friendships regardless of the order they are entered into the system. – Al_ Jul 10 '13 at 10:55
   
oh - i get it now... perhaps insert two records when you make a friend? one for 'each way' of the friendship? that would be easiest. – The Shift Exchange Jul 10 '13 at 11:52
   
That's my backup plan, I was hoping there was a cleaner way of doing it though – Al_ Jul 10 '13 at 12:03
   
How did you handle this in the end @Al_? – Mike Feb 20 '14 at 11:25

Instead of creating two records use a new function.

public function friends()
{
  return $this->belongsToMany('User', 'friend_user', 'user_id', 'friend_id');
}

// Same table, self referencing, but change the key order
public function theFriends()
{
  return $this->belongsToMany('User', 'friend_user', 'friend_id', 'user_id');
}

//You can then call opposite record(s) using:
foreach( Auth::user()->theFriends as $theFriends )

I used this approach in my project so I can have better separation for organizing the results.

shareimprove this answer
 
   
This would require calling both friends() and theFriends() separately to get the collection of all friends. Hardly a very good solution, especially once you factor in the double SQL queries. – Mike Feb 20 '14 at 11:25
   
Yes—this is perfect for implementing followers, but less so for friends... – Ben Gotow Mar 20 '15 at 7:18
1 
Great example for a self referencing many-to-many relationship, maybe the names are implemented a little weird, but the basic principle holds up. +1 sir. – Dylan Pierce Aug 21 '15 at 17:01

use this

public function friends()
{
 return $this->belongsToMany('User', 'friend_user', 'user_id', 'friend_id')->orWhere('friend_id', $this->id);;
}

in this case you get one query and one record for each relation


来自  http://stackoverflow.com/questions/17567305/laravel-many-to-many-self-referencing-table-only-works-o...


普通分类: