【问题标题】:Laravel Eloquent not returning all related modelsLaravel Eloquent 不返回所有相关模型
【发布时间】:2016-02-20 09:44:47
【问题描述】:

我有一个模型不返回相关模型,Call 和 CallType 是我的模型,具有一对一的关系。

调用模型

public function calltype(){
    return $this->hasOne('App\CallType');
}

CallType 模型

public function call(){
    return $this->belongsTo('App\Call');
}

CallsController 索引方法

 $calls = Call::all();
    $user_group = Group::find(Auth::user()->group_id);

    return view('settings.calls.index', compact('calls', 'user_group'));

calls.blade.php

@foreach($calls as $call)

   <tr>
     <td>{{$call->call_code}}</td>
     <td>{{$call->call_name}}</td>
     <td>{{$call->calltype->type}}</td>
   </tr>
@endforeach

调用迁移

Schema::create('calls', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('call_type_id')->unsigned();
            $table->string('call_name');
            $table->string('call_code');
            $table->date('start_date');
            $table->date('end_date');
            $table->string('target_audience')->nullable();
            $table->text('description')->nullable();
            $table->timestamps();
            $table->softDeletes();

            $table->foreign('call_type_id')->references('id')->on('call_types');
        });

调用类型迁移

 Schema::create('call_types', function (Blueprint $table) {
        //
        $table->increments('id');
        $table->string('type');
        $table->timestamps();
    });

我收到此错误:

试图获取非对象的属性

当我做dd($calls) 时,它没有相关的模型。我究竟做错了什么?请帮忙。

【问题讨论】:

    标签: php laravel-5.2 laravel-blade


    【解决方案1】:

    试试这个
    在刀片中

     @if(isset($calls))
       @foreach($calls as $call)
        <tr>
         <td>{{$call->call_code}}</td>
         <td>{{$call->call_name}}</td>
         <td>{{$call->calltype->type}}</td>
       </tr>
       @endforeach
    @endif
    

    确保索引是calls 而不是$calls

    在克隆控制器中

    return view('calls')->with(['calls'=>$calls,'user_group'=> $user_group]);
    

    【讨论】:

    • 但是,即使我这样做,calltype 仍为空。calltype 应该在我执行 $call = Call::all(); 时返回,但它没有被返回。
    【解决方案2】:

    首先,您应该使用预先加载来最小化数据库查询。

    变化:

    $calls = Call::all();
    

    进入

    $calls = Call::with('calltype')->get();
    

    你得到的错误是因为你可能没有为每个调用设置 calltype,所以你应该在你的模板中进行更改:

    <td>{{$call->calltype->type}}</td>
    

    进入

    <td>{{ $call->calltype ? $call->calltype->type : '-' }}</td>
    

    【讨论】:

    • 我只有一个电话,它有一个类型。感谢热切的加载建议。或者也许这是我定义我的关系的方式。我已经编辑了原始帖子以描述迁移
    • 我必须说这之前有效。或者在我有多个类型的调用的情况下,它只返回一种类型,其余的则失败。它的行为真的很奇怪。
    【解决方案3】:

    我想通了。我应该在 CallType 上有一个 hasMany,因为每个 CallType 都可以分配许多 Calls。应该是这样的:

    CallType 模型

    public function calls()
    {
     return $this->hasMany('App\Call');
    }
    

    调用模型

    public function call_type(){
        return $this->belongsTo('App\CallType');
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2023-04-06
      • 2018-06-30
      • 2022-01-05
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多