2017-02-13 60 views
-1

我有一个关系函数,当数据库中有一个image_name时,它完美地工作。Yii2关系功能

我可以使用$model->fromProfile->mainImage->image_name得到图像文件名,它可以工作。

但是,如果查询返回whiteout image_name(如果用户没有上传任何适合查询的图像),我会收到一个错误,说“试图获取非对象的属性”。

但是为什么?我在应该处理这个函数的函数中有一个规则,函数应该检查image_name是否存在,如果没有,image_name应该是'no_image.jpg';

这是应该处理这个案件的功能:

public function getMainImage(){ 
    $mainImage = $this->hasOne(Image::className(), ['profile_id' = > 'profile_id']) 
     ->andOnCondition(['main' = > '1']); 

    if (!isset($mainImage->image_name)) { 
     $mainImage = new Image(); 
     $mainImage->image_name = 'no_image.jpg'; 
    } 

    return $mainImage; 
} 

这是剖面模型:

public static function tableName(){ 
    return 'tbl_user_profile'; 
} 

public function rules(){ 
    return[ 
     [['user_id'], 'required'], 
      [['user_id'], 'integer'], 
      [['place'], 'in', 'range' = >array_keys(self::PLACE)], 
      [['meeting'], 'in', 'range' = >array_keys(self::MEETING)], 
      [['expiriance'], 'in', 'range' = >array_keys(self::EXPIRIANCE)], 
      [['lookingfor'], 'in', 'range' = >array_keys(self::LOOKINGFOR)], 
      [['about'], 'string'], 
      [['user_id'], 'exist', 'skipOnError' = > true, 'targetClass' = > User::className(), 'targetAttribute' = >['user_id' = > 'user_id']], 
    ]; 
} 

public function attributeLabels(){ 
    return[ 
     'profile_id' = > 'Profile ID', 
      'user_id' = > 'User ID', 
      'about' = > 'about', 
      'place' = > 'place', 
      'meeting' = > 'meeting', 
      'expiriance' = > 'expiriance', 
      'lookingfor' = > 'Looking for', 
    ]; 
} 


public function getMainImage(){ 
    $mainImage = $this->hasOne(Image::className(), ['profile_id' = > 'profile_id']) 
     ->andOnCondition(['main' = > '1']); 

    if (!isset($mainImage->image_name)) { 
     $mainImage = new Image(); 
     $mainImage->image_name = 'no_image.jpg'; 
    } 

    return $mainImage; 
} 

这是图像模式:

public static function tableName(){ 
    return 'tbl_images'; 
} 

public function rules() { 
    return[ 
     [['profile_id', 'image_name'], 'required'], 
      [['profile_id', 'is_private', 'main'], 'integer'], 
      ['image_name', 'image', 'minWidth' = > 250, 'minHeight' = > 250, 'extensions' = > 'jpg, gif, png, jpeg', 'maxSize' = > 1024 * 1024 * 2], 
      [['image_name'], 'string', 'max' = > 255], 
      [['profile_id'], 'exist', 'skipOnError' = > true, 'targetClass' = > Profile::className(), 'targetAttribute' = >['profile_id' = > 'profile_id']], 
    ]; 
} 

public function attributeLabels(){ 
    return[ 
     'image_id' = > 'Image ID', 
      'profile_id' = > 'Profile ID', 
      'image_name' = > 'Image Name', 
      'is_private' = > 'Private Image', 
      'main' = > 'Main Image', 
    ]; 
} 

public function getUser(){ 
    return $this->hasOne(User::className(), ['user_id' = > 'user_id']); 
} 

public function getViewers(){ 
    return $this->hasOne(View::className(), ['viewed_profile_id' = > 'profile_id']); 
} 


public function getProfile(){ 
    return $this->hasOne(Profile::className(), ['profile_id' = > 'profile_id']); 
} 
+0

AREV确定为列名? ...更新你的问题,并添加你图像模型和模型,你有功能getMainImage – scaisEdge

+0

请添加个人资料模型.. – scaisEdge

+0

我添加了个人资料模型 –

回答

0

可能是你应该检查$ mainImage而不是$ mainImage-> image_name

if(!isset($mainImage)) 
{ 
    $mainImage = new Image(); 
    $mainImage->image_name = 'no_image.jpg'; 
    } 

或者检查是否正确输入了列名image_name 或尝试为每个零件添加的表名(由于该列名的ambiguty

$mainImage = $this->hasOne(Image::className(), 
     ['tbl_user_profile.profile_id' => 'tbl_images.profile_id']) 
+0

$ mainImage存在,当我使用关系时,配置文件模型传递给$ mainImage,$ mainImage永远不会为空。 .. –

+0

我已经更新了一些简短的建议希望是有用的 – scaisEdge

+0

当存在一个image_name存在即时通讯使用:$ model-> fromProfile-> mainImage-> image_name从视图中获取图像名称。 问题发生时,没有图像,然后我只是得到一个错误,说:“试图获得非对象的属性” –