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

1

Я работаю над 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() !!}
Теги:
has-many
laravel-5

3 ответа

1

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

  • 0
    продолжить с ошибкой Вызов функции-члена first () в null
  • 0
    проблема в моем лезвии, потому что, если я получаю «Auth :: user () -> redessociais () -> first () -> facebook» работает и отправляет все правильно.
0

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

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

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

public function redessociais(){ 
    return $this->hasMany('App\RedesSociais','id_user','id');
}
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню