亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

laravel下 如何更優雅的實現這個數據查詢需求

laravel下 如何更優雅的實現這個數據查詢需求

PHP
滄海一幻覺 2019-03-17 00:32:11
背景 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。 不知道是解答時手誤還是我其他環節出了問題。
查看完整描述

1 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

你這是標準的多對多模型關聯
在你的資源Model里定義個新方法:

public function tags()
{
    return $this->belongsToMany('標簽Model');
}

然后:

資源Model::query()
->tags()
->whereIn('res_id',[1,3,5])
->orderBy('create_time','desc')
->limit(5)
->get();

2017-12-5
試試:

ResModel::whereHas('knowledge', function ($query) use ($knowledge_ids) {
    $query->whereIn('knowledge_id', $knowledge_ids);
})
->orderBy('created_at', 'desc')
->limit(5)
->get();
查看完整回答
反對 回復 2019-03-18
  • 1 回答
  • 0 關注
  • 459 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號