Как я могу присоединиться в Laravel для получения данных? - PullRequest
0 голосов
/ 03 мая 2018

Я работаю с Laravel 5 и у меня есть следующие модели

Group.php

class Group extends Model
{

    protected $fillable = ([
    'id'
    ]);

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

    public function posted(){
        return $this->hasMany(
            'App\PostGroup'
        );
    }
}

PostGroup.php

class PostGroup extends Model
{
    protected $fillable = [
        'group_id', 'user_id', 'post_content'
    ];

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

    public function group(){
        return $this->belongsTo('App\Group');
    }

    public function commented(){
        return $this->hasMany(
            'App\PostComment'
        );
    }
}

PostComment.php

class PostComment extends Model
{
    protected $fillable = [
        'post_id', 'user_id', 'comment_content'
    ];

    public function post(){
        return $this->belongsTo('App\PostGroup');
    }

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

}

Контекстуально мое веб-приложение представляет groups, в котором вы можете создать posts и в какой пост вы можете написать comments. Итак, у меня есть следующие отношения в моей базе данных:

  • Группа: (идентификатор, имя, описание);
  • PostGroup: (id, group_id, user_id, post_content);
  • PostComment: (id, post_id, user_id, comment_content);

Что я хочу сделать, это , чтобы создать список объектов PostComment, а затем сделать запрос , чтобы получить все комментарии всех сообщений группы , в MySQL выглядит как:

SELECT post_comment.* FROM post_comment,post_group WHERE post_comment.post_id = post_group.id AND post_groups.group_id = 1;

Теперь, например, в Laravel, если я хочу получить все сообщения группы, у меня есть следующая строка кода:

$postList = Group::find($id)->posted->sortByDesc('created_at');

Где posted - функция в Групповой модальности. Я пытался сделать что-то вроде

$commentList = PostGroup::where('group_id', $id)->commented;

Но это не работает, как я могу решить?

EDIT

GroupController.php

/**
 * Display the specified resource.
 *
 * @param  int $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    // Replace with shares of publication-group-model
    $authUser =  Auth::user();
    $sharesList = Group::find($id)->shares->sortByDesc('created_at');
    $groupList = $authUser->groupsAsMember->where('id', '<>', $id);
    $group = $authUser->groups->find($id);
    $postList = Group::find($id)->posted->sortByDesc('created_at');

    $postsGroups = PostGroup::where('group_id', $id)->with('commented')->get(); 

    //dd($postsGroups);

    foreach ($postsGroups as $postGroup) {
        $commentsList = $postGroup->commented;
    }

    //dd($commentsList);

    return view('Pages.Group.detail', ['sharesList' => $sharesList, 'groupList' => $groupList, 'theGroup' => $group, 'postList' => $postList, 'commentsList' => $commentsList]);
}

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вам нужно сделать что-то вроде этого:

$id = "1"; //suppose
$postsGroups = PostGroup::where('group_id', $id)->with('commented')->get(); //this will give you a collection

dd($postGroups); //check this first

//with every loop, add comments to the comment collection    
foreach ($postsGroups as $postGroup) {
    $comments = $postGroup->commented;
    dd($comments); //check  if you are getting the data
}

Относительно другого вопроса из комментариев: (Ниже код даст вам некоторое представление)

use Illuminate\Database\Eloquent\Collection;   // use this to create new collections

     $id = "1";
     $postsGroups = PostGroup::where('group_id', $id)->with('commented')->get();

     $comments = new Collection();
     //now you can loop through the object to get the values

     foreach ($postsGroups as $postGroup) {
         $coms = $postGroup->commented;
         $comments->push([
                'comments' => $coms,
                ]);
     }
     return view('index', array(
            'comments' => $comments,
        ));
0 голосов
/ 03 мая 2018

Eloquent HasManyThrough предназначен для такого рода ситуаций, чтобы обеспечить доступ к удаленным отношениям:

class Group extends Model
{
    public function comments()
    {
        return $this->hasManyThrough(
            PostComment::class, 
            PostGroup::class, 
            'group_id', 
            'post_id',
            'id', 
            'id'
        );
    }
}
0 голосов
/ 03 мая 2018
// This doesn't work because you can't call `commented` on a query builder
$commentList = PostGroup::where('group_id', $id)->commented;

Вот один из способов сделать это, используя отношения:

// Eager load the commented relationship
$postsGroups = PostGroup::where('group_id', $id)->with('commented')->get();

foreach ($postsGroups as $postsGroup) {
    $comments = $postGroup->commented;
}

Если вы не хотите проходить по циклу или даже нуждаетесь в PostGroup, то вам нужно присоединить таблицу PostComment к таблице PostGroup, чтобы вы могли получить доступ к столбцу post_groups.group_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...