账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    laravel下 如何更优雅的实现这个数据查询需求
    25
    0

    背景

    laravel 版本

    5.4

    数据表关系

    res 资源
    tag 标签

    资源 和 标签是多对多关系,所以有中间表 res_tag。

    问题

    我希望取出一个资源列表,要求如下:

    • 最新的5条
    • tag.id in (1,3,5)

    笨方法

    我用查询构造器,实现这样的SQL语句。

    SELECT
        *
    FROM
        res
    LEFT JOIN res_tag ON res_tag.res_id = res.id
    WHERE
        res_tag.tag_id IN (1, 3, 5)
    

    期望答案

    laravel 中是否有更优雅的实现方法。

    我对更优雅的定义:比如利用ORM的 “关联” 是否能实现?

    20171205,追问

    非常感谢 @nopainnogain 的解答,我做了如下修改。

    代码

    knowledge 就是 tag(上文我为了叙述问题,做了简化)

    $knowledge = new Knowledge();
    $res = $knowledge->res()
        ->whereIn('knowledge_id', $knowledge_ids)
        ->orderBy('created_at', 'desc')
        ->limit(5)->get();
    

    SQL

    实际执行的SQL语句,程序自动添加了 knowledge_res.knowledge_id IS NULL 这个查询条件,导致查不出任何数据。(去掉此查询条件,结果能满足需求

    SELECT
     * FROM
        `res`
    INNER JOIN `knowledge_res` ON `res`.`id` = `knowledge_res`.`res_id`
    WHERE
        `knowledge_res`.`knowledge_id` IS NULL
    AND `knowledge_id` IN (
        164,
        165,
        166,
        167,
        168,
        169,
        170
    )
    AND `res`.`deleted_at` IS NULL
    ORDER BY
        `created_at` DESC
    LIMIT 5
    

    另外,有一事疑惑

    回答中代码:资源Model::query()->tags()

    生成的SQL: select * from tag inner 资源 ... 这样取出的资源是以 tag 为主的,我希望是资源列表

    所以我改为:tagModel::query()->资源()

    生成的SQL:select * from 资源 inner join tag ... 也就是上文提供的SQL。

    不知道是解答时手误还是我其他环节出了问题。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 触碰岁月 普通会员 1楼

      在 Laravel 中,你可以使用 Eloquent ORM 来更优雅地实现数据查询需求。Eloquent 是 Laravel 提供的 ORM,它可以让你更方便地操作数据库。

      以下是一个简单的例子,展示了如何使用 Eloquent 来查询数据:

      ```php use App\Http\Controllers\UsersController;

      class UserController extends Controller { public function index() { $users = User::all(); return view('users.index', compact('users')); } } ```

      在这个例子中,我们首先导入了 Eloquent ORM,然后创建了一个名为 UserController 的控制器。在 UserController 中,我们定义了一个名为 index 的方法,该方法使用 Eloquent 的 all 方法来查询所有用户,并将查询结果作为参数传递给视图。

      这样,你就可以通过 URL 来访问这个视图,而不是通过数据库查询语句。这样不仅可以提高代码的可读性,还可以提高代码的执行效率。

      注意,Eloquent ORM 提供了各种查询方法,如 whereorWheregroupByhaving 等,你可以根据你的需求来选择合适的查询方法。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部