2017-06-12 10:37:53 2530次浏览 6条回答 0 悬赏 10 金钱

viaTable 没法排序么?难道只能写join语句?

补充于 2017-06-12 11:18

我来详细的说明下这个问题:
有三张表:
t_product 产品表,有字段 id
t_r_product_tag 产品标签关系表,有字段 product_id,tag_id
t_lib_tag 标签表,有字段 id,rank
排序使用 tag.rank
有如下定义:

function getTags(){
    return $this->hasMany(Tag::className() ,['id'=>'tag_id'])->viaTable("{{%r_product_tag}}",['product_id'=>'id']) ;
}

查询:

$product =Product::find()->alias('p')->where(['p.id'=>25])->joinWith(['tags t'])->orderBy('t.rank desc')->one();

取得产品的全部的标签:$product->tags ,
debug看到,执行的全部sql如下:


SELECT	SELECT `p`.* FROM `t_product` `p` LEFT JOIN `t_r_product_tag` ON `p`.`id` = `t_r_product_tag`.`product_id` LEFT JOIN `t_lib_tag` `t` ON `t_r_product_tag`.`tag_id` = `t`.`id` WHERE `p`.`no`='111100025' ORDER BY `t`.`rank` DESC

SELECT	SELECT * FROM `t_r_product_tag` WHERE `product_id`='25'

SELECT	SELECT * FROM `t_lib_tag` `t` WHERE `id` IN ('64', '47', '69', '68', '62', '55', '54', '53', '63', '52')

看最后一个sql,始终是用in语句, 而in语句是没有排序的,第一个sql 中的 t.rank desc 就没有意义了

  • 回答于 2017-06-12 10:47 举报
    $query->joinWith(['orders o'])->orderBy('o.id');
    
    1 条回复
    回复于 2017-06-12 11:33 回复

    排序的字段不在主表中

  • 回答于 2017-06-12 11:53 举报

    你参考一下吧:

        public function actionAs() {
            $authors = \app\models\Author::find()
                ->joinWith('blogs as b')
                ->where(['b.isDeleted' => 0])
    //            ->where(['blog.isDeleted' => 0])//此句报错,应使用别名b,而不能使用表名全称blog
                ->orderBy(['b.id'=>SORT_DESC])
                ->all();
            // $sql="select author.* from author left join blog on blog.authorid=author.id where blog.isDeleted=0";//对筛选出来的结果会自动合并同类项
            return $this->render('as',['authors'=>$authors]);
        }
    
    1 条回复
    回复于 2017-06-12 14:18 回复

    不一样,你这没有viaTable,没有中间关系表

  • 回答于 2017-06-12 15:44 举报

    没看懂题目。。。。。。。

    1 条回复
    回复于 2017-06-12 15:58 回复

    重新 修改了下问题,现在能看懂不?

  • 回答于 2017-06-12 16:00 举报

    tags,一对多,有好多个tag,你按哪个排序呢?要是唯一值,就没有必要使用junction了吧?

    1 条回复
    回复于 2017-06-12 16:04 回复

    排序使用 tag.rank desc
    我现在只能用函数,对得到的结果手动排序,yii2貌似做不到了。
    $tags=list_sort_by($product->tags,'rank','desc');

  • 回答于 2017-06-12 16:30 举报

    111.gif
    没看大明白,象上图这样的能满足你的排序要求不?

  • 回答于 2017-06-12 16:32 举报

    112.gif

    1 条回复
    回复于 2017-06-12 16:36 回复

    你这是1对1的排序,本身是没有问题的。
    我说的是1对多的关系,有中间表,现在只能写leftJoin语句,或者对得到的结果进行手动排序

您需要登录后才可以回答。登录 | 立即注册
wuyuxifeng
主管

wuyuxifeng

注册时间:2014-03-14
最后登录:2021-07-11
在线时长:30小时9分
  • 粉丝7
  • 金钱254
  • 威望30
  • 积分854

热门问题