Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2多对多关系的订单项_Php_Activerecord_Yii2_Yii2 Advanced App - Fatal编程技术网

Php Yii2多对多关系的订单项

Php Yii2多对多关系的订单项,php,activerecord,yii2,yii2-advanced-app,Php,Activerecord,Yii2,Yii2 Advanced App,我有两个与junction(sliders\u images)表相关的表(sliders,images),该关系工作正常,但我需要获得具有特定顺序的相关数据,定义正确顺序的属性位于junction表中,该关系定义为: public function getImages(){ return $this->hasMany(Images::className(), ['id' => 'image_id']) ->viaTable('sliders_images

我有两个与junction(sliders\u images)表相关的表(sliders,images),该关系工作正常,但我需要获得具有特定顺序的相关数据,定义正确顺序的属性位于junction表中,该关系定义为:

public function getImages(){
    return $this->hasMany(Images::className(), ['id' => 'image_id'])
        ->viaTable('sliders_images', ['slider_id' => 'id'], function($query){
            $query->orderBy('sliders_images.display_order ASC');
        });
}

当我调用
$model->images
时,我收到了正确的图像,但顺序错误,使用foreach按id排序图像,如何获得按其他属性排序的图像?

在这种情况下,
orderBy
将应用于第一个查询(
从滑块中选择*图像…
),因此,如果要检查生成的sql:

echo $model->getImages()->createCommad()->rawSql;
然后你会看到像这样的东西

SELECT * FROM images WHERE id IN (4, 2, 3, 1) 
这是正确的顺序。但在结果集中,您得到了id(1,2,3,4)的顺序

因此,为了获得正确的订单,您应该将所需的
orderBy
添加到您的
hasMany

public function getImages(){
  return $this->hasMany(Images::className(), ['id' => 'image_id'])
    ->viaTable('sliders_images', ['slider_id' => 'id'])
    ->orderBy(['images.display_order' => SORT_ASC]);
}

相关主题:

正确的方法是添加一个join with junction table
->joinWith('sliderimage')
以获取连接表属性,然后按其中一个属性排序。完整代码:

public function getImages(){
        return $this->hasMany(Images::className(), ['id' => 'image_id'])
        ->via('slidersImages')
        ->joinWith('slidersImages SI')
        ->orderBy('SI.display_order ASC');
}

Korshunow感谢您的重播,您的建议不是正确的方式,但请打开我的心扉,找到解决方案。表格图像没有显示顺序属性,这是一个连接表格属性。为了在查询中具有连接表属性,我需要一个
joinWith()
语句。遵循正确的答案。哦,错过了那个)你说得对。实际上,我总是喜欢为每个表声明独立的AR实体,并通过
joinWith
处理
,而不是在关系和查询中直接引用表。这种方法导致IMHO的代码更加干净、灵活和可持续。所以,毫无疑问,你走对了道路