Как получить данные через красноречивые отношения - PullRequest
0 голосов
/ 16 апреля 2019

Я получил эту форму, в которой вы выбираете клиента, и он вставляет client_id в БД

<div class="form-group">
    <label for="clientId">Client</label>
    <select name="client_id" class="form-control">
        @foreach($clients as $client)
            <option value="{{$client->client_id}}">
                {{$client->client_name}}
            </option>
        @endforeach 
    </select>
</div>

<div class="form-group">
    <button type="submit" class="btn btn-success">Submit</button>
</div>

Мой контроллер проекта это

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

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    if (Auth::user()->role != 'admin') {
        return redirect()->back();
    } else {
        return view('projects.create',[
            'project' => new Project,
            'clients' => Client::all(),
        ]);
    }
}

Итак, я хочу отобразить имя клиента из client_id для каждого проекта, это мой индекс

<tbody class=""> 
    @foreach ($projects as $project)
        <tr>
            <td>{{ $project->proj_id }}</td>
            <td>{{ $project->proj_title }}</td>
            <td>{{ $project->proj_desc }}</td>
            <td>{{ $project->client->client_name }}</td>
            <td>{{ $project->created_by }}</td>
            <td>{{ $project->created_at }}</td>
            @if (Auth::user()->role == 'admin')
            <td>

Модель клиента:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Client extends Model
{
    protected $primaryKey = 'client_id';

    protected $fillable = ['client_name','client_id'];

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

Модель проекта:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

Итак, как я могу получить данные из моего индекса? Я пытался, как это в документации, но я всегда получаю сообщение об ошибке.

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

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Поскольку клиент может иметь один / много проектов, вы должны определить обратную зависимость от модели проектов.Это станет: один проект принадлежит одному клиенту.

В коде: Модель проекта

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

Вы также можете заметить эту обратную зависимостьпотому что вы храните внешний ключ ( client_id ) в таблице projects .Если вы используете has one, Laravel будет искать внешний столбец в связанной таблице модели (clients в вашем примере).

Примечание: по вашему мнению, вы звоните client->client_name, но вы определили отношение как clients (множественное число).Я переименовал бы отношение в client (единственное число), поскольку оно лучше описывает это

0 голосов
/ 16 апреля 2019

В ваших проектах контроллер:

return view('projects.index', [
    'projects' => Project::with('clients')->get(),
]);

На ваш взгляд:

<td>{{$project->clients->client_name}}</td>

Поскольку вы назвали отношения проекта-> клиента в своей модели Проекта в качестве клиентов, несмотря на то, что это отношение hasOne.

Также я бы определил отношение проект-> клиент как BelongsTo вместо HasOne.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...