首页 > 解决方案 > laravel 中的一对多关系显示在视图中

问题描述

我正在开发laravel电话簿应用程序我希望每个电话簿都有一个客户,但客户属于许多电话簿我的电话簿表中有一个名为client_id的列现在当我设置关系时如何在控制器中使用它们并将其传递给视图在对象上,这是我的一些代码

电话簿控制器

public function index(){

$phonebooks = Phonebook::all();
$client = Phonebook::find(?dont know if its right place for it?)->client;
return view('admin.phonebooks.index',compact('phonebooks',$phonebooks),compact('client',$client));}

电话簿型号

class Phonebook extends Model{protected $fillable = ['title','description','client_id','calldate','rememberdate'];public function client() {
return $this->hasOne('App\Client','id');}    }

电话簿数据库迁移

Schema::create('phonebooks', function (Blueprint $table) {
    $table->increments('id');
    $table->text('title');
    $table->longText('description');
    $table->integer('client_id');
    $table->dateTime('calldate');
    $table->dateTime('rememberdate');
    $table->timestamps();
});

和客户端数据库迁移

Schema::create('clients', function (Blueprint $table) {
    $table->increments('id');
    $table->text('title');
    $table->longText('description');
    $table->integer('fax');
    $table->text('adrress1');
    $table->integer('telephone1');
    $table->timestamps();
});

以及我想在其中展示的视图

@foreach($phonebooks as $phonebook)
<tr>
    <th scope="row">{{$phonebook->id}}</th>
    <th scope="row">{{$phonebook->title}}</th>
    <td><a href="/admin/phonebooks/{{$phonebook->id}}">{{$phonebook->description}}</a></td>
    <td>{{$phonebook->calldate}}</td>
    <td>{{$phonebook->created_at->toFormattedDateString()}}</td>

    <td>{{$client->title}}</td>
    <td>
        <div class="btn-group" role="group" aria-label="Basic example">
            <a href="{{ URL::to('admin/phonebooks/' . $phonebook->id . '/edit') }}">
                <button type="button" class="btn btn-warning">edit</button>
            </a>&nbsp;
            <form action="{{url('admin/phonebooks', [$phonebook->id])}}" method="POST">
                <input type="hidden" name="_method" value="DELETE">
                <input type="hidden" name="_token" value="{{ csrf_token() }}">
                <input type="submit" class="btn btn-danger" value="delete"/>
            </form>
        </div>
    </td>
</tr>@endforeach

标签: phplaravel

解决方案


我建议使用急切加载来加载所有客户端,这样效率会更高,您可以在文档中阅读原因

您可以在控制器上执行此操作:

public function index()
{
    $phonebooks = Phonebook::with('client')->get();
    return view('admin.phonebooks.index',compact('phonebooks',$phonebooks);
}

然后在您看来,由于您定义的关系,您可以访问电话簿客户端:

@foreach ($phonebooks as $phonebook) 
    {{ $phonebook->client->title }}
@endforeach

推荐阅读