将模型对象从控制器传递到包含laravel内部连接的视图

时间:2017-08-15 12:35:58

标签: laravel laravel-5

根据https://laravel.com/docs/5.2/queries#joins文档,我已加入我的控制器文件。

但是我想从我的视图文件中的对象中获取数据。但它显示错误!

我的Routers.propTypes = { history: PropTypes.object.isRequired } 文件

PagesController

我无法从我的视图文件

中的$storages=DB::table('storages') ->join('dealers_of_distributors', 'storages.distributorId', '=', 'dealers_of_distributors.distributorId') ->select('storages.*', 'dealers_of_distributors.dealerId') ->get(); return views('pages.home')->withStorages($storages); 对象中获取数据

我的Storages文件

views

我看到的第一个错误:

@if($storages->isEmpty())
    <li>No Storage!</li>
@else
    @foreach($storages as $stg)
        <li>{{ $stg->name }}</li>
        <li>{{ $stg->distributor->name }}</li> //I've done implemented distributor() function inside storage moel
        @foreach($stg->dealerId as $dealer) //multiple dealers for 1 storage
            <li>{{ $dealerId }}</li>
        @endforeach
    @endforeach
@endif

我该如何解决?

2 个答案:

答案 0 :(得分:0)

我们使用DB::table('table_name')->get();它将返回一个数组而不是一个对象。如果你想拥有一个模型对象,你应该使用像Storage::get();

这样的东西

答案 1 :(得分:0)

在Laravel 5.2及其他版本之前,在QueryBuilder实例上调用get()将返回array而不是Collection。这就是为什么你的代码在调用这一行时会抛出错误的原因:

$storages->isEmpty()

在您的代码示例中,$storagesarray,因此没有isEmpty()方法。如果您使用QueryBuilder,结果将是一个平面数组,因此无法一次查询多个dealers_of_distributors条记录。

最简单的解决方案是使用Eloquent

首先,您需要一个Storage模型。在其中,添加dealersOfDistributors()方法以定义与dealers_of_distributors表的one-to-many关系。

<?php
// App/Storage.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Storage extends Model
{
    protected $table = 'storages';

    public function dealersOfDistributors()
    {
        return $this->hasMany(DealersOfDistributor::class, 'distributorId', 'distributorId');
    }
}

接下来,您还需要DealersOfDistributor型号:

<?php
// App/DealersOfDistributor.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class DealersOfDistributor extends Model
{
    protected $table = 'dealers_of_distributors';
}

最后,您可以轻松查询storages表和eager loadingdealers_of_distributors的关系:

$storages = App\Storage::with('dealersOfDistributors')->get();

return views('pages.home')->withStorages($storages);

现在,在您的视图中,您可以将$storages数据视为Collection Storage模型:{/ p>

@if($storages->isEmpty())
    <li>No Storage!</li>
@else
    @foreach($storages as $storage)
        <li>{{ $storage->name }}</li>
        @foreach($storage->dealersOfDistributors as $dealer)
            <li>{{ $dealer->dealerId }}</li>
        @endforeach
    @endforeach
@endif

希望这有帮助!