如何在创建事件上调用模型函数? Laravel-5

时间:2015-10-02 20:21:13

标签: php laravel laravel-5 referrals

我正在尝试在首次创建用户时创建引荐网址。 我的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

提前感谢您的帮助人员=]

p.s:如果有更好的方法来创建推荐网址,请告诉我。

更新

我的整个用户模型

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

1 个答案:

答案 0 :(得分:0)

通常应在creating中调用boot()方法:

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

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

然后在第一次保存模型之前自动调用

我在您的代码中看到的问题是您正在尝试修改尚不存在的关系

因此,要解释一下,hasOne方法将尝试在SQL中将当前模型连接到远程模型(在您的情况下为ReferralUrl模型),但在保存之前它无法执行此操作您的模型,因为数据库中的模型不存在

第二次尝试时,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;
    }
}