我正在研究laravel,我很难意识到这个错误。 “在null上调用第一个成员函数” 错误有点奇怪,好像用户在数据库表中有一条记录,代码正常工作,但如果它是一个新记录,并且你在redessocias表中没有任何记录,则会向我询问此错误“致电成员函数first()on null“ 对这个问题有任何想法吗?
班级用户
public function redessociais(){
return $this->hasMany('App\RedesSociais','id_user','id')->first();
}
Class RedesSociais
public function user() {
return $this->belongsTo('App\User');
}
控制器
public function updateSocial() {
$redesociais = Input::except('_token');
$redesociais['id_user'] = Auth::user()->id;
$validation = Validator::make($redesociais, RedesSociais::$redesociais);
if ($validation->passes()) {
if($user = RedesSociais::find(Input::get('id'))->first()) {
$user -> update($redesociais);
}else{
$user = RedesSociais::insert($redesociais);
}
Session::flash('redes_sociais', 'Redes sociais editadas com sucesso');
return Redirect::to('backend/perfil/redes_sociais');
} else {
return Redirect::to('backend/perfil/redes_sociais')->withInput()->withErrors($validation);
}
}
Social.blade.php
{!! Form::open(array('class' => 'form-horizontal', 'url' => 'backend/perfil/redes_sociais', 'name' => 'updateSocial', 'role' => 'form'))!!}
<input type="hidden" name="id" value="{{Auth::user()->id}}">
<div class="row">
<div class="col-md-3 col-lg-3"></div>
<div class="col-md-7 col-lg-7">
@if (count($errors) > 0)
<div class="alert alert-danger" style="margin-top: 0px;">
<strong>Ups!</strong> Existe algum problema com o formulário.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
</div>
</div>
<div class="row">
<div class="col-md-3 col-lg-3"></div>
<div class="col-md-7 col-lg-7">
@if (Session::has('redes_sociais'))
<div class="alert alert-success" style="margin-top: 0px;">
{{ Session::get('redes_sociais') }}
</div>
@endif
</div>
</div>
<div class="row" style="margin-bottom: 20px;">
<div class="col-md-3 col-lg-3"></div>
<div class="col-md-2 col-lg-2">
{!! Form::label('facebook', 'Facebook', ['class' => 'label_perfil']) !!}
</div>
<div class="col-md-5 col-lg-5">
{!! Form::text('facebook', Auth::user()->redessociais()->first()->facebook, ['class' => 'form-control input-md' , 'placeholder' => 'Facebook']) !!}
</div>
</div>
<div class="row" style="margin-bottom: 20px; margin-top: 30px;">
<div class="col-md-3 col-lg-3"></div>
<div class="col-md-9 col-lg-9">
{!! Form::submit('Alterar redes sociais', ['class' => 'btn btn-primary']) !!}
</div>
</div>
{!! Form::close() !!}
答案 0 :(得分:1)
使用find()时,如果找到记录,则返回Eloquent对象,否则返回null。所以,如果你使用find() - &gt; first(),只有找到记录才能正常工作。如果未找到,则为null,并且您不能执行null-&gt; first()。这就是错误所说的。解决方案是这样检查:
if($user = RedesSociais::find(Input::get('id'))) {
$user -> update($redesociais);
}else{
$user = RedesSociais::insert($redesociais);
}
您还可以检查是否(!is_null(RedesSociais :: find(Input :: get('id'))))
答案 1 :(得分:0)
错误表示您呼叫first()
的对象 - 在本例中为RedesSociais::find(Input::get('id'))
- 为NULL
。因此,您的RedesSocials
模型中似乎不存在此记录。
尝试在此行之前的某处添加dd(Input::get('id'))
以检查您的Controller实际接收的ID。然后检查此ID是否在您的数据库中。
答案 2 :(得分:0)
除了提供的其他两个答案外,另一个问题是您在first()
方法中调用redessociais()
。在您的刀片文件中,您将再次针对该结果调用first()
。
因此,如果没有关联的记录,Auth::user()->redessociais()
将返回null(因为它已经调用了first()
),然后你在null上再次调用first()
。
如果redessociais()
是关系方法,则不应调用first()
。它应该定义为:
public function redessociais(){
return $this->hasMany('App\RedesSociais','id_user','id');
}