简体   繁体   中英

Eloquent Relationships Laravel connecting multiple tables together

i am attempting to rewrite all my joins into Elequent model relationships. Here is what i have so far:

class SectionAndUser
{
    public function sections()
    {        
        return $this->belongsTo('App\Models\Section');
    }

    public function users()
    {
        return $this->belongsTo('App\Models\User');
    }
    ...
class User
{
    public function sectionAndUser()
    {
        return $this->hasMany('App\Models\SectionAndUser');
    }
    ...
class Section
{
    public function sectionAndUsers()
    {
        return $this->hasMany('App\Models\SectionAndUser');
    }
    ...

With the select:

 $sections = User::find($userId)->sectionAndUser()->get();

I get the result:

{
    "id": 1,
    "section_id": 1,
    "user_id": 133
}

How do i now attach the 3 model section that carries all the data about section_id 1?

This is the join that i am hoping to achieve:

$id=Auth::id();
$results = DB::table('sections')
    ->join('section_and_users', function ($join) use ($id) {
        $join->on('sections.id', '=', 'section_and_users.section_id')
            ->where('section_and_users.user_id','=', $id);
    })
    ->get();

The expected result:

{
    "id": 1,
    "section_id": 1,
    "section_name": 'sectionName'
    "user_id": 133
}

I think the solution is to create only models Section and User , and add the relationship as BelongsToMany.

class User
{
    public function sections()
    {
        return $this->BelongsToMany('App\Models\Section');
    }
    ...

And

<?

class Section
{
    public function users()
    {
        return $this->BelongsToMany('App\Models\User');
    }
    ...

And of course, you need to create the pivot table. You can consult BelongsToMany documentation .

If you use this way, you can simple get the result with this query:

$section = Section::find(1); // This will return all your Section data
$section_related_users = $section->users; // This will return a collection of Users

You could do it this way

$id=Auth::id();
$results = SectionAndUser::where('user_id', $id)->with('users', 'sections')->get();

then you could map it to get your desired output

$sections = collect($results)->map(function ($section){
     return [
          'id' => $section->id,
          'section_id' => $section->id,
          'section_name' => $section->sections->name,
          'user_id' => $section->user_id
     ];

});

You can create a many-to-many realtionship without the SectionAndUser -model.

With the belongsToMany -method, you can pass the name of the pivot table as a second argument. You can view Illuminate\\Database\\Eloquent\\Concerns\\HasRelationships@belongsToMany if you want to know what other arguments you can pass.

Section:

class Section extends Model
{
    ...
    public function users()
    {
        return $this->belongsToMany(User::class, 'section_and_users');
    }
    ...
}

User:

class User extends Model
{
    ...
    public function sections()
    {
        return $this->belongsToMany(Section::class, 'section_and_users');
    }
    ...
}

Then use it as this: $user->sections->where(...

// Post Model
 public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function categories()
    {
        return $this->belongsToMany('App\Category')->withTimestamps();
    }

    public function tags()
    {
        return $this->belongsToMany('App\Tag')->withTimestamps();
    }
// Role Model
 public function users()
    {

        return $this->hasMany('App\User');

    }

// User Model
 public function role()
    {
      return $this->belongsTo('App\Role');
    }

    public function posts()
    {
        return $this->hasMany('App\Post');
    }
//Tag Model
public function posts()
    {
        return $this->belongsToMany('App\Post')->withTimestamps();
    }

// Catgory Model
 public function posts()
    {
        return $this->belongsToMany('App\Post')->withTimestamps();
    }
// controller 
 public function index()
    {
        $posts = Post::latest()->get();
        return view('admin.post.index',compact('posts'));
    }
// posts tabel to user result get
 foreach($posts as $post){
$post->user->name
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM