Отображаемое имя из идентификатора выдает мне «Попытку получить свойство ‘proj_title’ не-объекта»

#php #laravel #eloquent #eloquent-relationship

#php #laravel #красноречивый #красноречивое отношение

Вопрос:

У меня есть форма, в которой я отправляю идентификатор из «проекта»;

     <div class="form-group">
        <label for="Project">Project</label>
        <select name="proj_id" class="form-control">
            @if (count($project) == 0)          
            <option>There are no projects.</option>
            @else
                @foreach($project as $project)
                    <option value="{{$project->proj_id}}">{{$project->proj_title}}</option>
                @endforeach
            @endif

        </select>
    </div>
  

Эта часть работает правильно, она вставляет proj_id в базу данных, но когда я возвращаюсь к своему индексу, я хочу отобразить имя проекта из этого идентификатора.
Это мой индекс;

 <tbody class="">
        @foreach ($task as $task)
        <tr>
            <td>{{$task->task_id}}</td>
------->    <td>{{$projects->find($task->proj_id)->proj_title}}</td>
            <td>{{$task->task_title}}</td>
            <td>{{$task->task_desc}}</td>
            <td>{{$task->status}}</td>
            <td>{{$task->priority}}</td>
            <td>{{$task->created_by}}</td>
            <td>{{$task->created_at}}</td>
            @if (Auth::user()->role=='admin')
            <td>
  

Как бы то ни было, это выдает ошибку в названии.

Если я изменю эту строку, $task->proj_id она отобразит это без проблем.

Также это моя индексная функция в TaskController:

     public function index()
    {
        return view('tasks.index', [
            'task' => Task::all(),
            'projects' => Project::all(),
        ]);
    }
  

И это мои отношения:
Модель проекта;

 class Project extends Model
{
    protected $primaryKey = 'proj_id';
    protected $fillable = ['proj_title','proj_desc','client_id','created_by'];



    public function client (){
        return $this->belongsTo('AppClient');
    }
    public function tasks (){
        return $this->hasMany('AppTask');
    }

}
  

Модель задачи;

 class Task extends Model
{
    protected $primaryKey = 'task_id';

    protected $fillable = ['task_title','task_desc','status','priority','person_id','proj_title','proj_id','created_by'];

    public function project(){

        return $this->belongsTo('AppProject','proj_id');
    }


}
  

Заранее спасибо

Комментарии:

1. Вы $projects определили где-нибудь на своей индексной странице? Вы имели в виду Project::find($task->proj_id)->proj_title ?

Ответ №1:

сделайте это

<td>{{$task->project->proj_title}}</td> и это должно работать нормально, поскольку задача и проект имеют belongsTo взаимосвязь, вы должны иметь возможность получить модель проекта, связанную с $task использованием $task->project .

Комментарии:

1. Это сработало для меня после того, как я выполнил новую миграцию, спасибо. Кстати, у меня тот же сценарий с «created_by», который является идентификатором пользователя, мне нужно отобразить имя пользователя с этим идентификатором. Отношение то же самое, но с этим ^^^^ кодом это дает мне попытку получить свойство ‘name’ не-объекта

2. @Jesus проверьте, что вы получаете $task->project в этом случае.

3. Я получаю «Пытаюсь получить свойство ‘name’ не-объекта» для $task->user->name . Если я оставлю $task->name поле просто пустым, но оно не выдает ошибку

4. @Иисус, есть ли какая-либо связь с моделью задачи для модели пользователя?

5. Я только что понял это. Это было то, что я должен был указать свой внешний ключ. Большое вам спасибо, ваш ответ был действительно полезен!