imperium2335
imperium2335

Reputation: 24132

Laravel error when hasOne has nothing

I am trying to pre-populate some fields in a form and I'm new to relationships.

My controller:

public function index($supplierId) {
    $Supplier = new Supplier;
    $supplierData = Supplier::find($supplierId);
    $supplierData->countryId = ($supplierData->countryId == 0 ? 258 : $supplierData->countryId);
    $supplierData->writtenLanguageId = ($supplierData->writtenLanguageId == 0 ? 1 : $supplierData->writtenLanguageId);
    $supplierData->paymentTermsId = ($supplierData->paymentTermsId == 0 ? 5 : $supplierData->paymentTermsId);
    $countries = Countries::lists('country', 'id');
    $languages = Languages::lists('language', 'id');
    $paymentTerms = PaymentTerms::lists('term', 'id');
    $leadTimes = Leadtimes::lists('leadtime', 'id');
    return View::make('supplier.supplier', array(
                'supplierData' => $supplierData,
                'countries' => $countries,
                'languages' => $languages,
                'paymentsTerms' => $paymentTerms,
                'leadtimes' => $leadTimes
    ));
}

My model:

class Supplier extends Eloquent {
    protected $table = 'suppliers';

    public function email() {
        return $this->hasOne('SupplierEmail', 'supplierId');
    }

    public function creditLimits() {
        return $this->hasOne('SupplierCreditLimits', 'supplierId');
    }

    public function website() {
        return $this->hasOne('SupplierWebsite', 'supplierId');
    }
}

The problem:

<div class='col-xs-12 col-md-6'>{{Form::text('website', $supplierData->website->website, array('class' => 'form-control input-sm'))}}</div>

When there is no row (there is no record), I get:

Trying to get property of non-object (View: C:\wamp\vhosts\view\laravel\app\views\supplier\supplier.blade.php)

How do I get this to work properly?

Upvotes: 0

Views: 143

Answers (1)

damiani
damiani

Reputation: 7381

In your view, use isset to check the value first:

<div class='col-xs-12 col-md-6'>
    {{Form::text('website', 
      isset($supplierData->website->website) ? $supplierData->website->website : '', 
      array('class' => 'form-control input-sm'))
    }}
</div>

Or, better yet, handle this logic in your controller and pass the result to the view:

$supplierData->URL = isset($supplierData->website->website) ? $supplierData->website->website : '';

Upvotes: 1

Related Questions