Я работаю над 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, если запись найдена, в противном случае возвращает значение null. Итак, если вы используете find() → first(), он будет работать нормально только при обнаружении записи. Если не найдено, вы получите null, и вы не можете сделать null-> 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()
. В вашем файле клика вы снова вызываете first()
снова в этом результате.
Итак, если нет связанной записи, Auth::user()->redessociais()
вернет null (поскольку он уже вызвал first()
), а затем вы вызываете first()
снова на null.
Если redessociais()
предназначен как метод отношений, он не должен вызывать first()
. Он должен быть определен как:
public function redessociais(){
return $this->hasMany('App\RedesSociais','id_user','id');
}
Ошибка означает, что объект, по которому вы вызываете first()
- в этом случае, RedesSociais::find(Input::get('id'))
- NULL
. Похоже, что эта запись не существует в вашей модели RedesSocials
.
Попробуйте добавить dd(Input::get('id'))
где-то перед этой строкой, чтобы проверить, какой идентификатор фактически получает ваш контроллер. Затем проверьте, находится ли этот идентификатор в вашей базе данных.