Wasim
Wasim

Reputation: 5113

Testing existence of Eloquent relationship and creating if it doesn't exist

What would be the best way to create a relationship if it doesn’t exist already, within Eloquent, or at least a central location.

This is my dilemma. A User must have a Customer model relationship. If for whatever reason that customer record doesn’t exist (some bug that stopped it from being created) - I don’t want it to throw errors when I try to retrieve it, but I also request the customer object in multiple locations so I don’t want to test for existence in all those places.

I thought of trying the following in the User model:

public function getCustomerAttribute($value) {
        // check $value and create if null
    }

But that doesn’t work on relationships, $value is null.

EDIT

I already create a customer upon user creation, but I have come across a situation where it wasn't created and caused exceptions in many places, so I want to fallback.

User::created(function($user) {
           $customer = Customer::create([
               'user_id' => $user->id
           ]);
        });

Upvotes: 0

Views: 142

Answers (1)

Dylan Pierce
Dylan Pierce

Reputation: 4668

Is it possible for you to assume when a user is created that a customer needs to be created as well? If the rest of your system depends on this assumption I would make a model event.

use App\{User, Customer}; // assuming php7.0

UserServiceProvider extends ServiceProvider
{
    /**
     * Boot
     */
     public function boot()
     {
        // on a side note, we're using "created" not "creating" because the $user->id needs to exist in order to save the relationship.
        User::created(function($user) {
           $customer = Customer::create([
               'user_id' => $user->id
           ]);
        });
     }
}

Upvotes: 1

Related Questions