Красноречивые отношения Laravel, соединяющие несколько таблиц вместе - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь переписать все мои объединения в отношения модели Elequent. Вот что у меня есть:

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

С выбором:

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

Я получаю результат:

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

Как мне теперь присоединить раздел модели 3, содержащий все данные о section_id 1?

Это соединение, которого я надеюсь достичь:

$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();

Ожидаемый результат:

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

Ответы [ 4 ]

2 голосов
/ 22 января 2020

Я думаю, что решение состоит в том, чтобы создать только модели Section и User и добавить отношение как BelongsToMany.

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

И

<?

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

И, конечно же, вам необходимо создать сводную таблицу. Вы можете обратиться к документации BelongsToMany .

Если вы используете этот способ, вы можете просто получить результат с помощью этого запроса:

$section = Section::find(1); // This will return all your Section data
$section_related_users = $section->users; // This will return a collection of Users
1 голос
/ 22 января 2020

Вы можете создать real -ship многие-ко-многим без SectionAndUser -модели.

С помощью метода belongsToMany вы можете передать имя сводной таблицы в качестве второго аргумента. Вы можете просмотреть Illuminate\Database\Eloquent\Concerns\HasRelationships@belongsToMany, если хотите узнать, какие другие аргументы вы можете передать.

Раздел:

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

Пользователь:

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

Затем используйте его как это: $user->sections->where(...

1 голос
/ 22 января 2020

Вы можете сделать это следующим образом

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

, тогда вы можете отобразить его, чтобы получить желаемый результат

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

});

0 голосов
/ 23 января 2020
// 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...