Как вызвать функцию модели при создании события? Laravel-5

Я пытаюсь создать реферальную ссылку при первом создании пользователя.
Моя функция внутри моей модели User выглядит следующим образом:

private function make_url()
{
$url = str_random(40);
$this->referral_url->url = $url;
if ($this->save()){
return true;
}
else{
return false;
}
}

Внутри модели я пытался сделать это, но не получилось

USER::creating(function ($this){
$this->make_url();
})

Я также попытался вызвать его в моем контроллере пользователя в рамках действия создания пользователя

public function create(UserRequest $request)
{
$data = $request->all()
$data['password']= bcrypt($request->input('password'));

if($user=User::create($data))
{
$user->make_url();
}
}

Я получаю эту ошибку в ответ

Indirect modification of overloaded property App\User::$referral_url has no effect

Заранее спасибо за вашу помощь, ребята =]

ps: если есть лучший способ создать реферальные URL, пожалуйста, скажите мне.

Обновить

Вся моя модель пользователя

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
use Authenticatable, CanResetPassword;

protected $table = 'users';

protected $fillable = [
'first_name',
'last_name',
'url',
'email',
'password',
'answer_1',
'answer_2',
'answer_3'
];


protected $hidden = ['password', 'remember_token'];


public function make_url()
{
$url = str_random(40);
$this->referral_url->url = $url;
if ($this->save()){
return true;
}
else{
return false;
}
}

public function user_info()
{
return $this->hasOne('App\UserInfo');
}

public function sec_questions()
{
return $this->hasOne('App\SecurityQuestions');
}

public function referral_url()
{
return $this->hasOne('App\ReferralUrl');
}
}

Обновить
Я изменил функцию в модели, чтобы она теперь выглядела так.

public function make_url()
{
$url = str_random(40);
$referral_url = $this->referral_url;
$referral_url = new ReferralUrl();
$referral_url->user_id = $this->id;
$referral_url->url = $url;
if ($referral_url->save()){
return true;
}
else{
return false;
}
}

Когда я звоню

$user->make_url()

Я могу создать его, и он появляется в моей БД, но я также получаю сообщение об ошибке

Trying to get property of non-object

0

Решение

Обычно creating метод должен быть вызван в течение boot():

public static function boot() {
parent::boot();

static::creating(function ($model) {
$model->foo = 'bar';
});
}

Это будет тогда вызываться автоматически до модель сохраняется в первый раз.

Проблема, которую я вижу с вашим кодом, состоит в том, что вы пытаетесь изменить отношение, которое еще не существует.

Чтобы объяснить, hasOne Метод попытается присоединить текущую модель к удаленной модели (в вашем случае ReferralUrl модель) в SQL, но он не может сделать это, прежде чем сохранить вашу модель, потому что ваша модель не существует в базе данных.

Со второй попытки ReferralUrl объект — это тот, который изменяется, поэтому его нужно сохранить:

public function make_url() {
$url = str_random(40);
$referral_url = $this->referral_url
$referral_url->url = $url;
if ($referral_url->save()){
return true;
} else {
return false;
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]