0

我的代码是由 Laravel+dingo 构建的。

我有两个模型,它们是一对多的关系:

Reservation.php(主)

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Reservation extends Model
{
    protected  $table = 'dbo.Reservation';

    public function hasManyReservationDetails()
    {
        return $this->hasMany('App\Models\ReservationDetail', 'ReservationID', 'ReservationID');
    }
}

ReservationDetail.php(详细信息)

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ReservationDetail extends Model
{
    protected  $table = 'dbo.ReservationDetail';

    public function belongsToReservation()
    {
        return $this->belongsTo('App\Models\Reservation', 'ReservationID', 'ReservationDetailID');
    }

}

两个模型的两个变形金刚如下:

预订变压器

public function transform(Reservation $reservation)
{
    return [
        'reservation_id'        => (int) $reservation->ReservationID,
        'reservation_no'        => $reservation->ReservationNo,
    ];
}

ReservationDetail 转换器

public function transform(ReservationDetail $reservation_detail)
{
    return [
        'reservation_detail_id' => (int) $reservation_detail->ReservationDetailID,
        'reservation_id'        => (int) $reservation_detail->ReservationID,
        'room_no'               => $reservation_detail->RoomNo,
    ];
}

我的控制器和询问

    $reservation = Reservation::where('ReservationNo', '=', $reservation_no)
        ->with('ReservationDetails')
        ->get();
     return $reservation;

我得到以下回报

{
  "Reservations": [
    {
      "ReservationID": "1",
      "ReservationNo": "2016-06-01 16:50:59.0659",
      "reservation_details": [
        {
          "ReservationDetailID": "1",
          "ReservationID": "1",
          "RoomNo": "001",
        },
        {
          "ReservationDetailID": "2",
          "ReservationID": "1",
          "RoomNo": "002",
        }
      ]
    }
  ]
}

我尝试以下但只返回主表的翻译。

$reservation = $this->collection($reservation, new ReservationTransformer());

**

如何将主表和明细表的数据一起转换?

**

我不太了解“自定义转换层”的工作原理,谁能给我一个例子?

非常感谢。

4

1 回答 1

1

您可以使用分形构建来支持转换器包含。见http://fractal.thephpleague.com/transformers/

我会先重命名public function hasManyReservationDetails()public function reservationDetails().

然后你的 ReservationTransformer 会处理剩下的事情:

use League\Fractal\TransformerAbstract;

class ReservationTransformer extends TransformerAbstract
{
    /**
     * List of resources to automatically include
     *
     * @var array
     */
    protected $defaultIncludes = [
        'reservationDetails',
    ];

    public function transform(Reservation $reservation)
    {
        return [
            'reservation_id'        => (int) $reservation->ReservationID,
            'reservation_no'        => $reservation->ReservationNo,
        ];
    }

    /**
     * Include ReservationDetail
     *
     * @param  Reservation  $reservation
     *
     * @return League\Fractal\Resource\Collection
     */
    public function includeReservationDetails(Reservation $reservation)
    {
        return $this->collection($reservation->reservationDetails, new ReservationDetailTransformer);
    }
}
于 2016-07-15T14:00:10.347 回答