【问题标题】:How to get data from not directly related tables and use it on gridview with modelSearch() Yii2如何从不直接相关的表中获取数据并使用 modelSearch() Yii2 在 gridview 上使用它
【发布时间】:2016-11-12 05:40:27
【问题描述】:

我有 3 个类 Persona、Alumno 和 factura。我需要使用 gridview 和搜索功能在 factura 视图上显示人员全名。全名在 Persona 中。 Factura 仅通过 id_alumno 与 alumno 相关,而 alumno 通过 id_persona 与 persona 相关。 我尝试通过创建一个新变量全名和一个函数来获取类 factura 的角色来解决这个问题。

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

就像它没有 getter...当它尝试执行 $this->load($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 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);
    ...

【问题讨论】:

  • 这是我用的,但我的问题不止于此。
  • 对不起,我没有深入了解您的问题..但错误似乎与搜索功能有关...当/在哪里出现错误时..当您调用相关的控制器/操作或在您过滤搜索时显示网格视图之后?
  • 无论如何我已经发布了第一个建议......希望有用
  • 更新您的问题并在 FacturaSearch 模型中添加函数搜索的所有代码

标签: php yii yii2


【解决方案1】:

您应该在 FacturaSearch 中为全名添加一个 pubblic var

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

【讨论】:

  • 感谢 scaisEdge 的努力,但我仍然遇到同样的错误。我也在 factura 模型上添加了一个公开的 $fullname,但没有运气。
  • 对不起,我不明白你在说什么。我把它和你的答案一样,我不起作用。
  • 你已经告诉你已经在 factura 模型中添加了 $fullname .. 我的回答是不要在 factura 模型中添加 $fullmodel 因为你有这个 getFullname 函数.. 你应该添加$fullname 仅在 facturaSearch 模型中...但您可以添加功能搜索的所有代码..以及控制器/动作的代码(与您的网格视图相关)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多