【问题标题】:How to get data from not directly related tables Yii2如何从不直接相关的表 Yii2 中获取数据
【发布时间】:2016-11-11 13:55:49
【问题描述】:

我有 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(){
  return $this->idPersona->nombre." ".$this->idPersona->apellido;
}

我得到并在返回线上出错。

PHP 通知 – yii\base\ErrorException

试图获取非对象的属性

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

第一个问题修复

现在我得到: 无效调用 – 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 search($params)
{
    $query = Factura::find();

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

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

【问题讨论】:

    标签: php yii2


    【解决方案1】:

    在尝试访问之前,最好先检查是否从关系中获取属性:

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

    但这不是这里的问题。看起来关系配置不正确。

    如果Alumno 模型表中的主键确实是id_alumno 并且Persona 模型表中的主键确实是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');
    }
    

    如果是这种情况,上述内容应该会有所帮助。如果没有,请告诉我。

    【讨论】:

    • 第一次检查确实修复了它,谢谢,但我无法使 FacturaSearch 工作。 id 是正确的,它们都被命名为 id_persona 和 id_alumno。我会添加我得到的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多