Красноречивые отношения и hasmany Laravel 5

Я работаю над 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() !!}

1

Решение

Когда вы используете 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’)))))

1

Другие решения

Ошибка означает, что объект, на который вы звоните first() — в этом случае, RedesSociais::find(Input::get('id')) — является NULL, Таким образом, кажется, что эта запись не существует в вашем RedesSocials модель.

Попробуйте добавить dd(Input::get('id')) где-то перед этой строкой, чтобы проверить, какой идентификатор фактически получает ваш контроллер. Затем проверьте, есть ли этот идентификатор в вашей базе данных.

0

В дополнение к двум другим предоставленным ответам, другой проблемой является то, что у вас есть звонок first() внутри вашего redessociais() метод. В вашем блейд-файле вы звоните first() снова на этот результат.

Итак, если нет связанной записи, Auth::user()->redessociais() вернет ноль (так как он уже вызвал first()), а потом вы звоните first() снова на нуле.

Если redessociais() должен быть методом отношений, он не должен вызывать first(), Это должно быть определено как:

public function redessociais(){
return $this->hasMany('App\RedesSociais','id_user','id');
}
0
По вопросам рекламы [email protected]