2016-11-11 6 views
0

Ich habe 3 Klassen Persona, Alumno und factura. Ich muss die Person Fullname, auf Faktura mit der Gridview und der Suchfunktion zeigen. Der vollständige Name ist in Persona. Factura bezieht sich nur auf alumno durch id_alumno und alumno ist auf persona durch id_persona bezogen. Ich versuche, dies zu lösen, indem ich eine neue Variable fullname und eine Funktion, um persona auf der Klasse factura zu erhalten.Wie man Daten von nicht direkt verwandten Tabellen erhält 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; 
} 

Ich bekomme und Fehler auf der Rückleitung.

PHP Notice - yii \ base \ Error

Der Versuch, Eigentum von Nicht-Objekt

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

erste Problem

Jetzt bekomme ich Fix zu bekommen: Ungültige Anruf - yii \ base \ InvalidCallException

Festlegen der schreibgeschützten Eigenschaft: app \ models \ Facturasearch :: fullname

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); 
    } 

es ist wie es die Getter ... das Problem Sprung von der Linie haben tut, wenn er versucht $ this-> Last ($ params) zu tun;

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); 
    ... 

Antwort

1

Es ist am besten zuerst zu überprüfen, ob ein Attribut aus der Beziehung, bevor Sie versuchen geholt wird, darauf zuzugreifen:

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

Aber das ist hier nicht das Problem. Sieht so aus, als wäre die Beziehung nicht richtig konfiguriert.

Wenn der Primärschlüssel in Alumno Modelltabelle in der Tat ist id_alumno und Primärschlüssel in Persona Modelltisch ist in der Tat die id_persona Beziehung wahrscheinlich richtig eingestellt ist, aber in der Regel Primärschlüssel sind nur id genannt und in diesem Fall sollten die Beziehungen sein:

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

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

Wenn dies der Fall ist, sollte das obige helfen. Wenn nicht - lass es mich wissen.

+0

der erste Chek hat es repariert, danke, aber ich kann nicht die FacturaSearch Arbeit machen. Die ID ist korrekt, sie heißen id_persona und id_alumno. Ich füge den Fehler hinzu, den ich bekomme. – chatoxz

Verwandte Themen