2015-10-02 2 views
0

Я пытаюсь создать реферальный URL-адрес, когда пользователь впервые создан. Моя функция в моей модели пользователя выглядит следующим образом:Как мне вызвать функцию модели для создания события? Laravel-5

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(); 
}) 

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

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 

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

p.s: Если есть лучший способ идти о создании приглашений URLs, пожалуйста, сообщите мне.

обновление

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

<?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() 

Я могу создать его, и он показывает в моем дб, но я также получить error-

Trying to get property of non-object 
+0

Что остальная часть вашей пользовательской модели выглядеть? – samlev

+0

i обновил сообщение с полной моделью пользователя – joejoeso

ответ

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

Спасибо. Я обновил свой пост. Когда я вызываю функцию в моем контроллере, она сохраняется в моем db, но я также получаю сообщение об ошибке. – joejoeso

+0

возьмите '$ referral_url = $ this-> referral_url;' (строка 2) из ​​вашей обновленной функции. – samlev

+0

ahh я вижу, Так как я создаю новый реферальный объект, мне это не нужно. – joejoeso

Смежные вопросы