Php 拉维尔3号—;如何从has_many()返回特定字段

Php 拉维尔3号—;如何从has_many()返回特定字段,php,json,eloquent,laravel-3,Php,Json,Eloquent,Laravel 3,我想找出做某事的最佳方法。我有一个表“组”,与另一个表“车辆”(车辆组)有很多关系。我想查询groups表并获取一个组数组,每个组包含一个相关车辆ID数组(如果有)。最终结果应该是对象的JSON数组: [{"id":4534,"group_name":"Annual",vehicles:[2311,3357]},{"id":4752,"group_name":"Summer",vehicles:[5,3348,4316]},{"id":4533,"group_name":"Winter",veh

我想找出做某事的最佳方法。我有一个表“组”,与另一个表“车辆”(车辆组)有很多关系。我想查询groups表并获取一个组数组,每个组包含一个相关车辆ID数组(如果有)。最终结果应该是对象的JSON数组:

[{"id":4534,"group_name":"Annual",vehicles:[2311,3357]},{"id":4752,"group_name":"Summer",vehicles:[5,3348,4316]},{"id":4533,"group_name":"Winter",vehicles:[3116]}];
到目前为止,通过这些方法:

public function vehicle()
{
    return $this->has_many('Vehicle');
}

public static function many()
{
    return self::with (array('vehicle'))
            ->where('account_id', '=', Session::get('account_id_selected'))
            ->order_by('group_name')
            ->select(array('id', 'group_name'))
            ->get();
}
我得到这个结果:

[0] => Array
    (
        [id] => 4534
        [group_name] => Annual
        [vehicle] => Array
            (
                [0] => Array
                    (
                        [id] => 2311
                        [created] => 2007-06-01

                    )

                [1] => Array
                    (
                        [id] => 3357
                        [created] => 2008-08-25
                    )

            )

    )

[1] => Array
    (
        [id] => 4752
        [group_name] => Summer
        [vehicle] => Array
            (
                [0] => Array
                    (
                        [id] => 5
                        [created] => 0000-00-00

                [1] => Array
                    (
                        [id] => 3348
                        [created] => 2008-08-18

                [2] => Array
                    (
                        [id] => 4316
                        [created] => 2011-02-24

            )

    )

[2] => Array
    (
        [id] => 4533
        [group_name] => Winter
        [vehicle] => Array
            (
                [0] => Array
                    (
                        [id] => 3116
                        [created] => 2008-05-15

            )

    )
目前,在查询之后,我使用以下方法将其全部分解为JSON:

 foreach (Group::many() as $group) {
      $groups[] = $group->to_array();
 }
 var Groups = {{ json_encode($groups); }};
上述方法(对我来说)存在两个问题:(1)它返回vehicles表的所有字段(我只需要ID)。(2) 我希望vehicles属性只包含一个ID数组,而不是一堆嵌套对象

现在,我知道可以在遍历雄辩的对象时解析vehicle属性并格式化查询结果:

$groups = array();
foreach (Group::many() as $group) {
    $v = array();
    foreach ($group->vehicle as $vehicle) {
        $v[] = $vehicle->id;
    }
    $groups[] = array('id' => $group->id, 'group_name' => $group->group_name, 'vehicles' => $v);
}
var Groups = {{ json_encode($groups); }};

但我真的认为这应该在模型中实现。我想我要问的是,在您看来,从这种模型关系到生成JSON的最佳方式是什么?可以消除foreach循环和额外的解析代码来生成上面描述的更简单的JSON对象?

只需使用连接即可-更灵活

public static function many()
{
    return self::join('vehicles', 'vehicles.account_id', '=, 'accounts.id')
            ->where('account_id', '=', Session::get('account_id_selected'))
            ->order_by('group_name')
            ->select(array('id', 'group_name', 'vehicles.id as vehicle_id'))
            ->get();
}
注意:我不确定数据库的表结构,所以不得不假设表名是复数的,并且假设了键关系,但是您应该能够计算出来


然后,您将为每个匹配的vechicle_id(即id将重复)获取一行或数组元素。只需通过某种形式的foreach循环来获得所需的结果。

您可以使用闭包来限制所选择的内容

public static function getManyByAccountId( $account_id )
{
  return self::with (
      array(
          'vehicle' => function($query) use ($account_id ) {
             $query->select('id as vehicle_id');
          }
      )
  )->select(array('id', 'group_name'))
   ->order_by('group_name')
   ->where('account_id', '=', $account_id);
}
然后他们会做点什么:

$vehicles = json_encode( Vehicles::getManyByAccountId($account_id)->to_array() );