Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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
Yii2 Activerecord从连接表中获取字段,并根据这些字段进行排序_Activerecord_Yii2_Junction Table - Fatal编程技术网

Yii2 Activerecord从连接表中获取字段,并根据这些字段进行排序

Yii2 Activerecord从连接表中获取字段,并根据这些字段进行排序,activerecord,yii2,junction-table,Activerecord,Yii2,Junction Table,我有具有多对多关系的项和单位表。换句话说,项目有许多单位,单位有许多项目。我通过一个连接表item\u单元来管理关系。连接表除了项目id和单位id之外还有一些额外字段,即它有价格和重量(它是一个整数,用于管理每个项目的单位顺序以便于显示) 我管理模型中的关系如下: //In Items model /** * @return \yii\db\ActiveQuery */ public function getItemUnits() { retu

我有具有多对多关系的
单位
表。换句话说,项目有许多单位,单位有许多项目。我通过一个连接
item\u单元
来管理关系。连接表除了<代码>项目id和<代码>单位id之外还有一些额外字段,即它有价格和重量(它是一个整数,用于管理每个项目的单位顺序以便于显示)

我管理模型中的关系如下:

//In Items model
/**
     * @return \yii\db\ActiveQuery
     */
    public function getItemUnits()
    {
        return $this->hasMany(ItemUnits::className(), ['item_id' => 'id'])->orderBy(['item_units.weight' => SORT_DESC]);
    }


    public function getUnits()
    {
      return $this->hasMany(Units::className(), ['id'=> 'unit_id'])->select(['id','title'])->via('itemUnits');
    }
public function fields() {
      parent::fields();

      return [
          'price' => function($model){
            return $model->id; //Here I could not able to get the corresponding price field value from item_units -junction table- 
          },
          'id',
          'title',                

      ];
    }
//

//

在控制器中,我可以通过如下方式获取项目所有相关单元的数据:

$item = Items::findOne($id);
return Json::encode($item->units);
return Json::encode($item->itemUnits);
以下是获得的JSON对象的演示:

[{"id":"4","title":"قرص"},{"id":"5","title":"شريط 10"},{"id":"6","title":"علبة 2 شريط"}]
但是,我无法根据
item_units
表中的
weight
字段对结果进行排序,也无法将
price
字段包含在上面的演示结果-JSON Object-中

我只能以
项目单位
获取数据,作为单独的结果,如下所示:

$item = Items::findOne($id);
return Json::encode($item->units);
return Json::encode($item->itemUnits);
更新 根据这两个答案(@Ааааааааааа&@Onedev.Link),我覆盖了单元模型中的
字段
方法,如下所示:

//In Items model
/**
     * @return \yii\db\ActiveQuery
     */
    public function getItemUnits()
    {
        return $this->hasMany(ItemUnits::className(), ['item_id' => 'id'])->orderBy(['item_units.weight' => SORT_DESC]);
    }


    public function getUnits()
    {
      return $this->hasMany(Units::className(), ['id'=> 'unit_id'])->select(['id','title'])->via('itemUnits');
    }
public function fields() {
      parent::fields();

      return [
          'price' => function($model){
            return $model->id; //Here I could not able to get the corresponding price field value from item_units -junction table- 
          },
          'id',
          'title',                

      ];
    }
但是,我无法从连接表中获取
price
字段值,临时,我将其设置为当前模型id以防止产生错误。此外,我仍然无法通过使用连接表中的
weight
字段来设置顺序

更新2 换句话说,yii2ActiveRecords如何执行以下SQL查询:

SELECT units.id UnitID, units.title Unit, iu.weight, iu.price 
FROM units
 Left JOIN item_units AS iu
  ON iu.item_id = 1 AND iu.unit_id = units.id 
WHERE 
    units.id = iu.unit_id 
ORDER BY iu.weight;
您需要在ActiveRecord模型中使用
asArray

例如:

/**
 * @return array
 */
public function fields()
{
    return [
        'itemUnit', //will get getItemUnit method
    ];
}

or

/**
 * @return array
 */
public function extraFields()
{
    return [
        'itemUnits', //it is relation name
    ];
}
用法:

$model->toArray(); //will contains fields and extra fields relations
... sort array & return

默认情况下,yii\base\Model::fields()将所有模型属性作为字段返回,而yii\db\ActiveRecord::fields()仅返回从db填充的属性


您可以重写字段()以添加、删除、重命名或重新定义字段。fields()的返回值应为数组。数组键是字段名,数组值是相应的字段定义,可以是属性/属性名,也可以是返回相应字段值的匿名函数

我终于找到了解决办法。这取决于方法。我将使用更新2中的上述SQL查询-只是为了适合我当前的任务,我删除了一些选定的字段-


您能为使用添加更多详细信息吗?我在哪里可以覆盖它?在
项目中
模型?我怎样才能在
return$this->hasMany(Units::className(),['id'=>'unit\u id'])->select(['id','title'])->via('itemUnits')中获取字段值即类似于
。->选择(['id','title','itemUnits.price'])…