Я работаю над Laravel, и мне очень трудно понять эту ошибку.
«Вызов функции-члена first () в null«Ошибка немного странная, как будто у пользователя есть запись в таблице базы данных, код работает правильно, но если это новая запись, и у вас нет записи в базе данных в таблице redessocias, выдает мне эту ошибку» Вызов функция-член first () на null «Есть идеи для этой проблемы?
Класс пользователя
public function redessociais(){
return $this->hasMany('App\RedesSociais','id_user','id')->first();
}
Класс 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() !!}
Когда вы используете find (), он возвращает объект Eloquent, если запись найдена, в противном случае возвращает ноль. Так что, если вы используете find () -> first (), это будет нормально работать только тогда, когда найдена запись. Если не найден, вы получаете ноль, и вы не можете сделать нуль-> первый (). Вот что говорит ошибка. Решение состоит в том, чтобы проверить, как это:
if($user = RedesSociais::find(Input::get('id'))) {
$user -> update($redesociais);
}else{
$user = RedesSociais::insert($redesociais);
}
Вы также можете проверить, если (! Is_null (RedesSociais :: find (Input :: get (‘id’)))))
Ошибка означает, что объект, на который вы звоните first()
— в этом случае, RedesSociais::find(Input::get('id'))
— является NULL
, Таким образом, кажется, что эта запись не существует в вашем RedesSocials
модель.
Попробуйте добавить dd(Input::get('id'))
где-то перед этой строкой, чтобы проверить, какой идентификатор фактически получает ваш контроллер. Затем проверьте, есть ли этот идентификатор в вашей базе данных.
В дополнение к двум другим предоставленным ответам, другой проблемой является то, что у вас есть звонок first()
внутри вашего redessociais()
метод. В вашем блейд-файле вы звоните first()
снова на этот результат.
Итак, если нет связанной записи, Auth::user()->redessociais()
вернет ноль (так как он уже вызвал first()
), а потом вы звоните first()
снова на нуле.
Если redessociais()
должен быть методом отношений, он не должен вызывать first()
, Это должно быть определено как:
public function redessociais(){
return $this->hasMany('App\RedesSociais','id_user','id');
}