2016-11-11 90 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

相关问题