2016-11-11 66 views
0

我有3個角色Persona,Alumno和factura。我需要使用gridview和搜索功能來顯示person的全名。全名在Persona。 Factura僅通過id_alumno與alumno相關,而alumno通過id_persona與persona相關。 我嘗試通過創建一個新的變量全名和一個函數來獲得角色事實上的角色來解決這個問題。如何從直接相關的表中獲取數據Yii2

class Factura extends \yii\db\ActiveRecord{ 
    public $full_name; 

} 
public static function tableName() 
{ 
    return 'factura'; 
} 
public function rules() 
{ 
return [ 
    [['id_factura_reemplazo', 'id_obra_social', 'id_alumno',], 'integer'], 
    [['id_obra_social', 'id_alumno'], 'required'], 
    [['fecha_factura','fullname','id_persona'], 'safe'], 
]; 
} 
public function attributeLabels() 
{ 
return [ 
    'id_factura' => 'Id Factura', 
    'id_factura_reemplazo' => 'Id Factura Reemplazo', 
    'id_obra_social' => 'Id Obra Social', 
    'id_alumno' => 'Id Alumno', 
    'fullName'=>Yii::t('app', 'Nombre y Apellido'), 
    ]; 
} 
public function getIdAlumno() 
{ 
    return $this->hasOne(Alumno::className(), ['id_alumno' => 'id_alumno']); 
} 
public function getIdPersona() { 
    return $this->hasOne(Persona::className(), ['id_persona' => 'id_persona']) 
    ->via('idAlumno'); 
} 

public function getFullname(){ 
    return $this->idPersona->nombre." ".$this->idPersona->apellido; 
} 

我得到和返回線上的錯誤。

PHP的通知 - 警予\基地\ ErrorException

試圖讓非對象的屬性

public function getFullname(){ 
    return $this->idPersona->nombre." ".$this->idPersona->apellido; 
} 

1號問題解決

現在我得到: 無效呼叫 - 警予\ base \ InvalidCallException

設置只讀屬性:app \ models \ Facturasearch ::全名

if (method_exists($this, 'get' . $name)) { 
     throw new InvalidCallException('Setting read-only property: ' .  get_class($this) . '::' . $name); 
    } else { 
     throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name); 
    } 

就好像它不具有吸...從線路的問題,跳的時候它會嘗試做這 - $>負載($ params)方法;

class Facturasearch extends Factura{  
public function rules() 
{ 
    return [ 
     [['id_factura', 'id_factura_reemplazo', 'id_alumno', 'numero'], 'integer'], 
     [['id_obra_social','fecha_factura', 'observacion','id_alumno','fullName','id_persona'], 'safe'], 
    ]; 
} 

public function search($params) 
{ 
    $query = Factura::find(); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 

    $this->load($params); 
    ... 

回答

1

這是最好先檢查是否從關係屬性是試圖訪問它之前牽強:

public function getFullname() 
{ 
    if ($this->idPersona) { 
     return $this->idPersona->nombre." ".$this->idPersona->apellido; 
    } 
    return null; 
} 

但在這裏,這是沒有問題的。看起來關係沒有正確配置。

如果Alumno模型表的主鍵確實id_alumnoPersona模型表的主鍵確實id_persona的關係可能是正確設置,但通常主鍵只是名爲id在這種情況下的關係應該是:

public function getIdAlumno() 
{ 
    return $this->hasOne(Alumno::className(), ['id' => 'id_alumno']); 
} 

public function getIdPersona() 
{ 
    return $this->hasOne(Persona::className(), ['id' => 'id_persona'])->via('idAlumno'); 
} 

如果是這種情況,上述應該會有所幫助。如果沒有 - 讓我知道。

+0

第一個chek確實修復了它,謝謝,但我無法使FacturaSearch工作。該ID是正確的,它們都被命名爲id_persona和id_alumno。我會添加我得到的錯誤。 – chatoxz

相關問題