最佳做法是根据条件仅获得一个相关项目(1:n)

时间:2017-09-15 12:25:19

标签: laravel laravel-5

我有两张桌子,如下:

产品(id,name)

优惠券(id,product_id *,价值,开始,到期)

...使用我的JSON API,我想返回所有产品。如果现在有有效的有效优惠券,也应该退回。

目前我只得到这个JSON结果:

[{
 id: 1,
 name: 'A',
 coupons: [
  { ...},
  { ...},
]
}]

但我想得到这样的东西:

[{
 id: 1,
 name: 'A',
 coupon: { ...}
}]

我可以"预处理"我在控制器中查询的结果并手动设置优惠券属性。但也许有更聪明的方法来解决这个问题?我可以在Product-model中实现coupon()函数来处理这个吗?

修改

现在这个模型使我的代码更清洁了一些:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

    public function activeCoupons() {
        $instance = $this->hasMany('App\Models\Coupon', 'dish_id');
        $instance->getQuery()->where('start', '<', new \DateTime());
        $instance->getQuery()->where('end', '>', new \DateTime());
        return $instance;
    }
}

但现在,我需要手动设置

$product['coupon'] = $product->activeCoupons[0]

模型的activeCoupon函数是否可能不返回数组?它应该只返回一个对象(不是数组中的一个对象)。

1 个答案:

答案 0 :(得分:2)

如果每个产品只附加一张优惠券 在模型中

public function products()
{
    return $this->hasOne('App\coupons');
}

public function coupons()
{
    return $this->belongsTo('App\products');
}

并在控制器中

   public function allProducts(){
      $products = products::orderBy('id', 'ASC')->with('coupons')->get();
      return $products 
   }