从数据透视表

时间:2016-12-13 10:53:34

标签: php mysql laravel laravel-5 eloquent

我已经完成了一些类似的主题,但没有找到有效的解决方案。大多数情况下,我对这个概念并不了解。 我有一个简单的数据库,具有以下结构:

QUESTIONS
qid
question

TAGS
tagid
tag name

QUESTION_TAGS
qid
tagid

我的问题模型:

class Question extends Model
{
    protected $table="questions";

    public function tags()
    {
        return $this->hasMany('App\Question_tags','qid','qid');
    }

}

我的标签型号:

class Tags extends Model
{
    protected $table="tags";
}

Question_tags模型:

class Question_tags extends Model
{
    protected $table="question_tags";
}

问题控制员:

class QuestionCtrl extends Controller
{

    public function getquesdet(){
        $id = Request::input('id');

        $question = Question::where('q_id','=',$id)->with('tags')
        ->get();

        return $question;      
  }
 };

如预期的那样,返回的值由ids组成。所以,我希望返回的值是tag names。我很乐意听到一些解释。

2 个答案:

答案 0 :(得分:2)

通过查看数据库模式,它是一个many-to-many关系,因此您的关系函数应该是:

Question模型中:

public function tags()
{
    return $this-> belongsToMany('App\Tags', 'QUESTION_TAGS', 'qid', 'tagid');
}

Tags模型中:

public function questions()
{
    return $this-> belongsToMany('App\Question', 'QUESTION_TAGS', 'tagid', 'qid');
}

然后在您的控制器中,您可以写为:

$question = Question::where('q_id','=',$id)->with('tags')->first();

return $question->tags->pluck('name'); // returns array of tag names

注意 - 无需为数据透视表Question_tags定义模型。

答案 1 :(得分:1)

你好,在你的例子中,你试图在问题和标签之间建立多对多的关系,你的数据库看起来很好。 但是在你的模型中你已经建立了关系函数来填充相关数据中的函数问题。 你的问题模型是

class Question extends Model
{
protected $table="questions";

public function tags()
{
    return $this->hasMany('App\Question_tags','qid','qid');
}

}

在此您使用的hasMany函数用于建立1到多的关系。

使用函数belongsToMany将关系设置为多对多。