你这是1对1的排序,本身是没有问题的。 我说的是1对多的关系,有中间表,现在只能写leftJoin语句,或者对得到的结果进行手动排序
实现searchModel,gredview照样使用。 比如搜索relation_user中username单独查就行了:
$user=relation_user::find()->where(['username'=>'xxxx'])->one();
$query->andFilterWhere([
'relation_detail.user_id'=>$user->id
]);
tags,一对多,有好多个tag,你按哪个排序呢?要是唯一值,就没有必要使用junction了吧?
排序使用 tag.rank desc 我现在只能用函数,对得到的结果手动排序,yii2貌似做不到了。 $tags=list_sort_by($product->tags,'rank','desc');
你参考一下吧:
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]); }
不一样,你这没有viaTable,没有中间关系表
我来详细的说明下这个问题: 有三张表: 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 就没有意义了
原生的标签好啊,
<?php foreach($list as $item):?>
<?php endforeach?>
看看smarty:
{foreach from=$list key=$key item=$item}
{/foreach}
这不是在造轮子么,有嘛区别?,模版引擎很无聊,很无聊