繁体   English   中英

雄辩的关系和hasmany laravel 5

[英]eloquent relationships and hasmany laravel 5

我正在研究laravel,要实现这个错误非常困难。 首先在null上调用成员函数()上的错误”错误有点奇怪,好像用户在数据库表中有一条记录,该代码可以正常工作,但是如果它是新记录,并且您在数据库中没有任何记录在redessocias表中问我此错误“在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()的对象first()在本例中为RedesSociais::find(Input::get('id'))NULL 因此,似乎该记录在您的RedesSocials模型中不存在。

尝试在此行之前的某处添加dd(Input::get('id')) ,以检查您的控制器实际收到的ID。 然后检查此ID是否在您的数据库中。

除了提供的其他两个答案之外,另一个问题是您需要在redessociais()方法中调用first() 在您的刀片文件中,然后针对该结果再次调用first()

因此,如果没有关联的记录,则Auth::user()->redessociais()将返回null(因为它已经调用了first() ),然后您再次在null上调用first()

如果redessociais()应该是一种关系方法,则不应调用first() 它应该定义为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM