Php 如何通过modelSearch()Yii2从不直接相关的表中获取数据并在gridview上使用它

Php 如何通过modelSearch()Yii2从不直接相关的表中获取数据并在gridview上使用它,php,yii,yii2,Php,Yii,Yii2,我有三个班,分别是“人物”、“校友”和“事实”。我需要使用gridview和搜索功能在factura视图上显示人员全名。全名在Persona中。Factura仅通过id_alumno与alumno相关,而alumno通过id_persona与persona相关。 我试图通过创建一个新变量fullname和一个函数来解决这个问题,以便在类factura上获取persona class Factura extends \yii\db\ActiveRecord{ public $full_n

我有三个班,分别是“人物”、“校友”和“事实”。我需要使用gridview和搜索功能在factura视图上显示人员全名。全名在Persona中。Factura仅通过id_alumno与alumno相关,而alumno通过id_persona与persona相关。 我试图通过创建一个新变量fullname和一个函数来解决这个问题,以便在类factura上获取persona

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(){
  if($this->idPersona)
     return $this->idPersona->nombre." ".$this->idPersona->apellido;
  return null;
}
我得到: 无效调用–yii\base\InvalidCallException

设置只读属性: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);
    }
就像它没有吸气剂一样。。。当尝试执行$this->load($params)时,问题从行跳转


您应该在FacturaSearch中添加一个pubblic变量以查找全名

class Facturasearch extends Factura{  

  public $fullname;


  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 scenarios()
  {
      // bypass scenarios() implementation in the parent class
      return Model::scenarios();
  }
  public function search($params)
  {
      $query = Factura::find();

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

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

看看这个。。回答这是我用的,但我的问题不止于此。很抱歉,我没有深入研究你的问题。。但错误似乎与搜索功能有关。。。发生错误的时间/地点。。您是在调用相关控制器/操作还是在过滤搜索时显示gridview之后?无论如何,我已经发布了第一条建议。。。希望是有用的更新您的问题,并添加所有代码的功能搜索在FacturaSearch模型感谢努力scaisEdge,但我仍然得到相同的错误。我也在factura模型上添加了一个公共$fullname,但是运气不好。对不起,我不明白你在说什么。我把它和你的答案一模一样,但我不起作用。你已经告诉我你在factura模型中添加了$fullname。。我的答案是不要添加$fullmodel in factura模型,因为您有用于此的getFullname函数。。您应该仅在facturaSearch模型中添加$fullname。。。但是您可以添加函数搜索的所有代码..和控制器/操作的代码(与网格视图相关)?
class Facturasearch extends Factura{  

  public $fullname;


  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 scenarios()
  {
      // bypass scenarios() implementation in the parent class
      return Model::scenarios();
  }
  public function search($params)
  {
      $query = Factura::find();

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

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