简体   繁体   中英

Laravel many-to-many relationships

I am trying to work with many to many relationships in my web application. I have a table called groups and table called users.

Many users can be in many groups and many groups can have many users. ie there can be an infinate amount of users and groups, and users can belong to as many groups as they wish.

I have created a pivot table successful, and my models, look like this.

User.php

<?php

class User extends \\Eloquent {

protected $fillable = [];

protected $table = 'user';

public function groups()
{
    return $this->belongsToMany('Group');
}

}

Group.php

class Group extends \\Eloquent {

protected $fillable = [];

public function users()
{
    return $this->belongsToMany('User');
}

}

I am trying to get to grips with Eloquent ORM and I am doing the following,

public function get($id)
{

    //dd(Activity::log());
    $group = Group::find($id);

    return $group->users;

}

This returns a results that looks like this,

[
{
    "id": "1",
    "firstname": "User",
    "surname": "One",
    "email": "email@domain.com",
    "password": "password",
    "remember_token": null,
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00",
    "pivot": {
        "group_id": "1",
        "user_id": "1"
    }
},
{
    "id": "2",
    "firstname": "User",
    "surname": "Two",
    "email": "email@domain.com",
    "password": "password",
    "remember_token": null,
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00",
    "pivot": {
        "group_id": "1",
        "user_id": "2"
    }
}

]

This is not exactly what I was looking for, I was hoping that I would get something more explicit, meaning a rows returned including the group name etc, and the user details.

To get the group details I can switch the query in the get() function around, and then the pivot object in the returned results becomes the user details. To then get the user data do I need run further queries on that data.

Essentially what I hoping to output in the long run is,

Group Name 1
---------------------------------
Members
---------------------------------
    User One
    User Two
    User Five
    User Six
    User Ten
    User Nineteen

Sounds like you want an object consisting of on model, attached to its relations - called "eager loading" in laravel. There is a syntax for that:

Group::find($id)->with('users')->first() //or
Group::with('users')->get() //etc.

See more details here: http://laravel.com/docs/eloquent#eager-loading

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