对Laravel 5 Query Builder

时间:2017-02-09 08:32:25

标签: laravel laravel-5

我有这样的数据库结构(为了简化):

pets table
- id
- name
- owner_id

owners table
- id
- name
- city_id

cities table
- id
- name

我想打印完整的城市列表,其中每个城市旁边都有居住在那里的宠物数量。这就是我试图解决这个问题的方法:
这是我的控制器功能:

// get all pets and associate them with the matching owner record, so every pet has also a city where it lives in.
$pets = DB::table('pets')->join('owners', 'pets.owner_id', '=', 'owners.id')->get();

// get all cities
$cities = DB::table('cities')->get();

// pass values to the view
return View('cities_stats',array('pets'=>$pets, 'cities'=>$cities));

在我的Blade模板上:

@foreach($cities as $city)
    <li>
        {{ $city->name }}: // city name
        {{ $pets->where('city_id', $city->id)->count() }} pets // number of pets in this city
    </li>
@endforeach

问题在于它当然会抛出错误。我不能在where()中同时使用count(){{ $pets->where('city_id', $city->id)->count() }},因为$pets是一个数组。
那我该怎么办?

P.S。我正在使用Laravel 5.0。

2 个答案:

答案 0 :(得分:0)

为了简单起见,我建议你做反过来。

$cities = DB::table('cities')
->leftjoin('owners'...)
->leftjoin('pets'...)
->select(...)
->get();

或使用预先加载

$cities = City::with('owner.pets')->get();

在你看来,你只需循环而瞧!

答案 1 :(得分:0)

您应该传递查看非查询结果,但查看构建器本身。所以只需删除->get()

即可
$pets = DB::table('pets')->join('owners', 'pets.owner_id', '=', 'owners.id');

现在它不是数组。