Laravel Eloquents:检查子关系是否没有数据,不返回任何数据

时间:2018-09-12 11:34:35

标签: laravel eloquent

我有三个实体Inbox , Document , Category

收件箱与文档有关,文档有很多类别,

我有一个雄辩的查询,它检查收件箱和文档之间的关系并返回包含文档数据的收件箱,

问题是: 我只想在文档没有类别的情况下列出所有包含文档数据的收件箱(如果文档具有一个或多个类别,我不想在收件箱中列出此文档)。

所以我现在有这个查询,不能正常工作:

public static function getUserAndJobPositionsInbox($id, $type)
{
       return self::with(['documents' => function($q){

           $q->has('categories', '==', 0);

       }])->where('inboxable_id', $id)
          ->where('inboxable_type', $type)->get();
}

如果文档没有类别,此查询将返回没有文档的收件箱数据

  

但是如果文档没有类别,我不希望收件箱数据。只需返回空

结果是:

{
    "data": {
        "user_inbox_documents": null,
        "job_positions_documents": [
            [
                {
                    "id": 2,
                    "document_id": 3,
                    "document_reference": "RPL2p",
                    "inboxable_id": 3,
                    "inboxable_type": "App\\Models\\JobPosition",
                    "path_id": "2",
                    "created_at": "2018-09-12 13:21:23",
                    "updated_at": "2018-09-12 13:21:23",
                    "documents": []
                }
            ],
            [
                {
                    "id": 1,
                    "document_id": 3,
                    "document_reference": "RPL2p",
                    "inboxable_id": 2,
                    "inboxable_type": "App\\Models\\JobPosition",
                    "path_id": "1",
                    "created_at": "2018-09-12 13:21:23",
                    "updated_at": "2018-09-12 13:21:23",
                    "documents": []
                }
            ]
        ]
    }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用点(。)来检查嵌套关系的存在,例如以下代码(Laravel文档)获取所有具有至少一个评论且该评论应具有至少一票的职位。

// Retrieve all posts that have at least one comment with votes...
$posts = App\Post::has('comments.votes')->get();

因此在上面的示例中,您可以按以下方式修改代码:

public static function getUserAndJobPositionsInbox($id, $type)
{
    return self::has('documents.categories')
         ->where('inboxable_id', $id)
         ->where('inboxable_type', $type)->get();
}