我需要编写有说服力的查询来返回具有特定标记的消息

时间:2017-03-23 05:36:26

标签: laravel eloquent many-to-many where-clause

messages Table
+----+----------+
| id |   text   |
+----+----------+
|  1 | message1 |
|  2 | message2 |
+----+----------+

tags table 

+----+-----------+
| id |   name    |
+----+-----------+
|  1 | valentine |
|  2 | funny     |
|  3 | santa     |
+----+-----------+

message_tag
+----+------------+--------+
| id | message_id | tag_id |
+----+------------+--------+
|  1 |          1 |      1 |
|  2 |          2 |      1 |
|  3 |          2 |      2 |
+----+------------+--------+

到目前为止,我已经编写了这个查询来获取所有消息,但我无法返回 消息,其中tag_id = 1;

    Message::with([
        'tags'=>function($q){
            $q->select("name","tag_id");
        }
    ])->select("id", "text")->paginate(10);

我在函数内使用了where子句($ q){$ q-> where(' tag_id',1)}。但它没有奏效。

2 个答案:

答案 0 :(得分:2)

您必须在课程

的顶部加入use Illuminate\Support\Facades\DB;
$tagId = 1; 
$return = DB::table('message_tag')
            ->join('messages', 'messages.id', '=', 'message_tag.message_id')
            ->join('tags', 'tags.id', '=', 'message_tag.tag_id')
            ->where("message_tag.tag_id", "=", $tagId)
            ->select('messages.text', 'tags.text')
            ->get();

答案 1 :(得分:2)

尝试使用whereHas(),假设您正确设置了多对多关系:

$tag = 'Madhab452';
$messages = Message::whereHas('tags', function ($query) use ($tag) {
    $query->where('name', '=', $tag)
    ->select('name', 'tag_id');
})->get();