如何在创建事件时调用模型函数? Laravel-5
How do I call model function on create event? Laravel-5
我正在尝试在首次创建用户时创建引荐 url。
我的用户模型中的函数如下所示:
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();
}
}
我在 return
中收到此错误
Indirect modification of overloaded property App\User::$referral_url has no effect
在此先感谢您的帮助=]
p.s:如果有更好的方法来创建推荐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
通常 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;
}
}
我正在尝试在首次创建用户时创建引荐 url。 我的用户模型中的函数如下所示:
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();
}
}
我在 return
中收到此错误Indirect modification of overloaded property App\User::$referral_url has no effect
在此先感谢您的帮助=]
p.s:如果有更好的方法来创建推荐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
通常 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;
}
}