App \ Todo :: lead должен возвращать экземпляр отношения, но был возвращен "null". Было ли использовано ключевое слово "return"? - PullRequest
1 голос
/ 09 мая 2020

У меня есть модель Todo и Tbl_leads и там соответствующие таблицы todos и tbl_leads. Когда я пытаюсь указать имя лида, у меня возникает ошибка.

#This is Tbl_leads model
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tbl_leads extends Model
{

    //Table Name
    protected $table = 'tbl_leads';
    //Primary key
    public $primaryKey = 'ld_id';
    //Timestamps
    public $timestamps = true;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'ld_id', 'first_name', 'last_name', 'email',
    ];

    public function tasks() {
        $this->hasMany('App\Todo', 'lead_id','ld_id');
    }
}

Это модель Todo

<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Todo extends Model
{
    use SoftDeletes;

    protected $fillable = [

        'title',
        'description',
        'user_id',
        'outcome_id',
        'lead_id',
        'tasktype_id',
        'due_time',
        'complete_time',
    ];

    protected $casts = [
        'due_time' => 'datetime',
        'complete_time',
    ];

    public function lead() {

        $this->belongsTo('App\Tbl_leads', 'lead_id');
    }
}

Это мой метод индекса

 public function index()
    {
        $tasks = Todo::latest()->paginate(5);
        return view('taskmanagement.cruds.index',compact('tasks'));
    }

это лезвие, где я хочу получить имя из модели Tbl_leads

div class="card-body">
  <ul class="todo-list" data-widget="todo-list">
  @forelse($tasks as $task)
   <div class="col-3">
    @if(!empty($task->lead_id))
              <div>
             <small>Related to</small>
</div>
                                        <div class="mt-0">
          <a href="#">
<strong class="mx-4">{{$task->lead->first_name}}</strong>
</a> 
</div>
 @endif
   </div>                                   
      </div>
      </div>
       </li>
   @empty
     <p class="text-center">No Tasks is available</p>
   @endforelse

Пожалуйста, может кто-нибудь подскажет мне, что я сделал не так. И я знаю название модели, и там первичный ключ немного другой не установлен в соответствии с laravel. Правильны ли мои модельные отношения?

1 Ответ

1 голос
/ 09 мая 2020

Позвольте мне прояснить вам несколько моментов. Во-первых, вам нужно поставить return в каждое отношение. Например:

public function lead() {

    return $this->belongsTo('App\Tbl_leads', 'lead_id');
}

Следующее, что вы показываете, это часть {{$task->lead->first_name}}, которая называется отложенной загрузкой. Это означает, что если вы отображаете 100 записей из Todo, то вы запрашиваете базу данных 101 раз. 1 для Todo и 100 раз для lead->first_name. Что нехорошо. Итак, что вы можете сделать в своем методе index, передайте свое отношение в with(), чтобы оно было загружено. Это означает, что он превратится в один или два запроса или просто соединение. Так что будет быстро. Пример вашего метода index ...

public function index()
{
    $tasks = Todo::with('lead')->latest()->paginate(5);
    return view('taskmanagement.cruds.index',compact('tasks'));
}
...