试图在Yii2中获取非对象属性

时间:2018-01-31 06:14:42

标签: yii2 yii2-advanced-app yii2-basic-app yii2-model

当我尝试为gridview编写搜索和过滤查询时,我得到了上述错误,这里是代码:

商店模式:关系

public function getStoreNamesCombo(){
      return $this->storeName->classId . ' ' . $this->storeName->platformId . ' ' . $this->storeName->familyId . ' ' . $this->storeName->subFamilyName . ' ' . $this->storeName->variantName; 
    }
}

StoreSearch模型:

$query->joinWith(['author',
                   'storeNamesCombo']);

        if(!empty($this->storeNamesCombo)){      
        $query->andWhere('storeNames.classId LIKE "%' . $this->storeNamesCombo . '%" ' .
                               'OR storeNames.platformId LIKE "%' . $this->storeNamesCombo . '%" ' .
                               'OR storeNames.familyId LIKE "%' . $this->storeNamesCombo . '%" ' .
                               'OR storeNames.subFamilyName LIKE "%' . $this->storeNamesCombo . '%" ' .
                               'OR storeNames.variantName LIKE "%' . $this->storeNamesCombo . '%" ' .
                               'OR CONCAT(storeNames.classId, " ", storeNames.platformId, " ", storeNames.familyId, " ", storeNames.subFamilyName, " ",  storeNames.variantName) LIKE "%' . $this->storeNamesCombo . '%"'
                               );

的GridView

'value' => function($q) use ($storeFamilies, $storeClasses, $storePlatforms){
                        return implode('.', array_filter([
                        $storeClasses[$q->storeName->classId] ?? null,
                        $storePlatforms[$q->storeName->platformId] ?? null,
                        $storeFamilies[$q->storeName->familyId] ?? null,
                        $q->storeName->subFamilyName,
                        $q->storeName->variantName,
                        ]));

错误 试图获得非对象的属性

错误行:商店模型关系。

更新

public function getStoreName()
    {
        return $this->hasOne(StoreNames::className(), ['id' => 'storeNameId'])->via('transaction');
    } 

提前感谢,

1 个答案:

答案 0 :(得分:1)

确保首先获取关系以确保安全。

public function getStoreNamesCombo()
{
    if ($this->storeName) {
        return $this->storeName->classId . ' ' . $this->storeName->platformId . ' ' . $this->storeName->familyId . ' ' . $this->storeName->subFamilyName . ' ' . $this->storeName->variantName; 
    }
    return null;
}

修改
但是在你的代码中,有一件事没有意义。您正在使用getStoreNamesCombo()的值作为查询storeNames表的条件,这类似于初始构思。

我想你想做的是:

在表单模型中设置字段,该字段将填充查询条件的搜索词。

public $storeNameSearch;

用户通过表单填写例如。现在您可以将它用于查询。

if (!empty($this->storeNameSearch)){      
    $query->andWhere([
        'or',
        ['like', 'storeNames.classId', $this->storeNameSearch],
        ['like', 'storeNames.platformId', $this->storeNameSearch],
        ['like', 'storeNames.familyId', $this->storeNameSearch],
        ['like', 'storeNames.subFamilyName', $this->storeNameSearch],
        ['like', 'storeNames.variantName', $this->storeNameSearch],
    ]);
}

BTW检查连接字段似乎是多余的。

您可以在网格视图中使用getStoreNamesCombo()->storeNamesCombo)准备好的模型。

编辑2:

如果某些列是整数,那么以不同方式构建条件听起来更合理。如果您可以单独过滤每个列,并且有用户可以填充的过滤字段,则可能是:

$query
    ->andFilterWhere(['storeNames.classId' => $this->storeClassId])
    ->andFilterWhere(['storeNames.platformId' => $this->storePlatformId])
    ->andFilterWhere(['storeNames.familyId' => $this->storeFamilyId])
    ->andFilterWhere(['like', 'storeNames.subFamilyName', $this->storeFamilyName])
    ->andFilterWhere(['like', 'storeNames.variantName', $this->storeVariantName]);

其中前3列是整数,后两列是字符串。