【问题标题】:Object exist BUT trying to get property on a non object对象存在但试图获取非对象的属性
【发布时间】:2015-10-21 13:57:06
【问题描述】:

我正在使用 PHP 5.5.12 和 MYSQL 5.6.17 在 Laravel5 上开发一个项目 昨天一切正常,但是当我今天回到我的代码时, 我在多个模型对象上出现错误“尝试获取非对象的属性”,当它们与其他模型有关系时,这种情况经常发生。

如果我写这个:

$test = $model->relation->property;

我得到了错误。

如果我写这个:

echo / var_dump($model->relation->property);

然后它的打印没有问题。

我真的不知道会发生什么,任何帮助将不胜感激。

Ps:抱歉,如果我写的文字有误,这是我第一次在 stackoverflow 上提问 :) 哦,我确实已经阅读了所有类似的问题

这是 Stay.php 模型:

namespace App\models;

use Illuminate\Database\Eloquent\Model;

class Stay extends CustomModel {

protected $table = 'stay';

protected $fillable = array('reservation_terms_convention_id', 'reservation_id', 'period_id', 'total_price', 'price_ht', 'occupant_id', 'prestation_fixe_id', 'pax', 'checkin', 'checkout');

protected $guarded = array('id');

static public $mailTemplatingWhitelist = ['total_price'];

public static $rules = [
'reservation_terms_convention_id' => 'required|exists:reservation_terms_convention,id',
'period_id' => 'required|exists:period,id',
'payeur_id' => 'required'
];


    public function payment_due_date()
    {
        return $this->belongsTo('App\models\PaymentDueDate','payment_due_date_id', 'id');
    }
}

这里是相关模型:

<?php namespace App\models;

use Illuminate\Database\Eloquent\Model;

class PaymentDueDate extends CustomModel {


protected $table = 'payment_due_date';

protected $fillable = array('total_amount', 'acompte_amount', 'amount_ht', 'amount_already_payed', 'payment_total_date', 'payment_acompte_date',
        'facturation_date', 'description_facture', 'type', 'cash_desk_id', 'individual_customer_id',
        'partner_id', 'direction');

protected $guarded = array('id');


public function stay(){
    return $this->hasOne('App\models\Stay');
}

}

最后是控制器:

public function print_partner_invoice($partner_id, $echeance = 0)

    $partner = Partner::find($partner_id);

    // this return Collection of model
    $partner_resa = Partner::reservations_echeance($partner->id, $echeance);

    if(!$partner || $partner_resa->count() < 1)
        abort(403);



    $residence_company = $partner_resa->first()->residence->residence_company;

    $total_ttc = 0;
    $already_paid = 0;
    $tva_amount = 0;


    foreach ($partner_resa as $key => $resa) {

        foreach ($resa->stays as $key => $stay) {
            $amount = $stay->payment_due_date->total_amount;
        }

    }

    $pdf = \PDF::loadView('reglement.partner_invoice', [
        'partner'               => $partner,
        'resas'                 => $partner_resa,
        'residence_company'     => $residence_company,
        'total_ttc'             => $total_ttc,
        'already_paid'          => $already_paid,
        'tva_amount'            => $tva_amount
        ]);

    return $pdf->stream();
}

【问题讨论】:

  • 你在哪里得到错误?您应该在错误消息中包含文件名和行号
  • var_dump 输出是什么样子的
  • ReglementController.php 第 99 行中的ErrorException:尝试在 ReglementController.php 第 99 行中获取非对象的属性 此行产生错误:$amount = $stay->payment_due_date->total_amount;如果我写 var_dump($stay->payment_due_date->total_amount) 我没有错误

标签: php laravel-5 eloquent relationship


【解决方案1】:

首先,如果你写

var_dump($doesnotexists1->doesnotexists2->doesnotexists3); 

它为空,不会有错误,因为 var_dump 查找 $doesnotexists1,如果它为空,它不会再查找。所以你不会得到“试图在”执行中获取非对象的属性。

所以,您的问题可能是 $stay 或 $stay->payment_due_date at

 $amount = $stay->payment_due_date->total_amount;

为空/空。

我会像这样检查它

foreach ($partner_resa as $key => $resa) {

    foreach ($resa->stays as $key => $stay) {
      if(is_object(stay) && is_object($stay->payment_due_date)) {
        $amount = $stay->payment_due_date->total_amount;
      }
    }
}

确定它是一个对象

【讨论】:

  • 没有。会有通知PHP Notice: Undefined variable: doesnotexists1 in xxx on line YYY
  • @MarcinOrlowski,对不起,我不知道会有通知,谢谢
猜你喜欢
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2014-12-09
相关资源
最近更新 更多