繁体   English   中英

使用 Laravel 的 Eloquent 从多个表中检索数据的更好方法

[英]Better way to retrieve data from multiple table using Laravel's Eloquent

在我的测验应用程序上,我想让我的代码更具可扩展性,但我很困惑如何优化它,而这个最令人困惑.. 我有四个表

1.Question Table
2.QuestionOption Table
3.QuestionImage Table
4.QuestionSolutionImage Table

问题表与下表中的所有外键 QuestionId 链接

现在为了获取 questionData 我执行这段代码

       $builder = Question::where('TestId', $_testId);
        
       $data = $builder->with(['questionOptions' => function ($query) {
            $query->where('Status',1)
            ->select(['QuestionId', 'id', 'optionText', 'rank', 'isAnswer', 'timeStamp']);
        }]) ->with(['questionImages' => function ($query) {
            $query->where('Status',1)
            ->select(['QuestionId', 'id', 'imagePath', 'thumbPath', 'rank', 'timeStamp']);
        }])->with(['solutionImages' => function ($query) {
            $query->where('Status',1)
            ->select(['QuestionId', 'id', 'imagePath', 'thumbPath', 'rank', 'timeStamp']);
        }]);

        $data = $builder->select([
            'Id', 'uid', 'type', 'rank', 'questionText', 'totalMarks', 'negativeMark as negativeMarks', 'note', 'solutionText', 'status', 'timeStamp',
        ])->get()->toArray();

我得到了这个 output

 [
        {
            "Id": 1,
            "uid": "123456789098760",
            "type": "multiple",
            "rank": 1,
            "questionText": "2 + 2 = ?",
            "totalMarks": 5,
            "negativeMarks": 2,
            "note": null,
            "solutionText": null,
            "status": "active",
            "timeStamp": "2020-11-17 11:42:31",
            "questionOptions": [
                {
                    "QuestionId": 1,
                    "id": 1,
                    "optionText": "5",
                    "rank": 1,
                    "isAnswer": "no",
                    "timeStamp": "2020-11-17 11:42:31"
                },
                {
                    "QuestionId": 1,
                    "id": 2,
                    "optionText": "4",
                    "rank": 2,
                    "isAnswer": "yes",
                    "timeStamp": "2020-11-17 11:42:31"
                },
                {
                    "QuestionId": 1,
                    "id": 3,
                    "optionText": "four",
                    "rank": 3,
                    "isAnswer": "yes",
                    "timeStamp": "2020-11-17 11:42:31"
                },
                {
                    "QuestionId": 1,
                    "id": 4,
                    "optionText": "7",
                    "rank": 4,
                    "isAnswer": "no",
                    "timeStamp": "2020-11-17 11:42:31"
                }
            ],
            "questionImages": [
                {
                    "QuestionId": 1,
                    "id": 1,
                    "imagePath": "12345678",
                    "thumbPath": "thumbPath",
                    "rank": 10,
                    "timeStamp": "2020-11-17 11:42:31"
                },               
            ],
            "solutionImages": [
                {
                    "QuestionId": 1,
                    "id": 1,
                    "imagePath": "storage/app/solution/image/a7bBSNRkgy.jpg",
                    "thumbPath": "storage/app/solution/thumb/a7bBSNRkgy.jpg",
                    "rank": 10,
                    "timeStamp": "2020-12-04 10:32:49"
                }
            ]
        }
    ]

它看起来很完美并且工作正常,但从现在开始,随着用户增加这个问题 api 对 DB 的影响太大,导致 DB 上的连接问题太多,我也在 DB 上增加了这个问题。 但我的实际观点是我是否可以优化此代码并以更好的方式执行此代码,因为此代码会导致对 DB 的多次访问。 任何帮助将不胜感激,如果有什么误解,请询问。 谢谢 !!

您可以尝试将与查询生成器一起使用。 如果您将 eloquent 用于需要处理结果的大数据,那么原始 sql 比 eloquent 快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM