Laravel Eloquent 多对多通过名称而不是 id 的其他表并获取其他数据

我有两个主表,帖子和类别,它们应该具有多对多的关系。我知道你可以用一个名为 category_post 的表来完成,但这不是我能够使用的结构的设置方式。


就像这样:帖子与问题具有一对一的关系,并且问题通过帖子具有类别。


我的数据库如下所示:


Schema::create('posts', function (Blueprint $table) {

    $table->bigIncrements('id');

    $table->string('title');

    $table->text('contet');

}


Schema::create('post_questions', function (Blueprint $table) {

    $table->bigIncrements('id');

    $table->string('post_id');

    $table->integer('views');

    $table->integer('answers');

}


Schema::create('categories', function (Blueprint $table) {

    $table->bigIncrements('id');

    $table->string('name')->unique();

}


Schema::create('post_question_categories', function (Blueprint $table) {

    $table->bigIncrements('id');

    $table->integer('post_question_id');

    $table->string('category_name');

    $table->string('additional_info');

}


如您所见,我的数据透视表既没有 post_id 也没有 category_id,而是 post_question_id 和 category_name,这在 categories 表中是唯一的。但是应该是状态是多对多的帖子和类别。


问题也与查询附加信息具有一对多关系


这是我的模型:


class Post extends Model

{

    public function question()

    {

        return $this->hasOne('App\PostQuestion')->with('categories');

    }

}


class Question extends Model

{

    public function post()

    {

        return $this->belongsTo('App\Post');

    }


    public function categories()

    {

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

    }

}


class PostQuestionCategory extends Model

{

    public function question()

    {

        return $this->belongsTo('App\PostQuestion')->with('post');

    }

}


class Category extends Model

{

    public function posts()

    {


    }

}


所以这就是有趣的开始:我想查询一个类别的所有帖子。我已经尝试通过 3 种方法得到了这个:


1.


public function posts()

{

    $name = $this->name;


    return Post::whereHas('question', function ($question) use ($name) {

        $question->whereHas('categories', function ($categories) use ($name) {

            $categories->where('name', $name);

        });

    })->get();

}




慕侠2389804
浏览 120回答 1
1回答

慕的地8271018

我认为您的第二个查询已经解决了您的问题。只需像这样对其进行一些修改。public function posts(){    return PostQuestionCategory::with('question.post')->where('category_name', $this->name)->get();}只需将帖子与问题一起添加即可将其包含在返回的集合中。或者如果您也与类别有关系,那么您只需添加类别关系,就像这个 public function posts() {        return PostQuestionCategory::with('question.post', 'category')->where('category_name', $this->name)->get(); }
打开App,查看更多内容
随时随地看视频慕课网APP