【问题标题】:Laravel how to inverse relation outputLaravel如何逆关系输出
【发布时间】:2021-12-11 14:25:21
【问题描述】:

我有以下表格:

products(id, name, price)
features(id, name)
feature_values(id, feature_id, value)
warehouse (id, location)
product_warhouse(id, product_id, warehouse_id, quantity)

我想获取某个点(纬度,经度)最近仓库的产品,我希望输出如下:

products : {
{id: ... 
name:...
price: .... 
features: {
id: ...
name: ...
feature_vaulues:
{
{...},
{...}
}
}

换句话说:我想要具有每个产品的特征和每个特征的特征值并且也属于该产品的产品。

现在我有以下代码:

                $products= Product::whereHas('warehouses', static function ($q) use ($req) {
        $q->where('warehouses.id', Warehouse::orderByDistance('location', new Point($req- >query('lat'), $req->query('lng')))->first()->id);
    })
        ->with('feature_values')
        ->with('feature_values.feature')
        ->paginate();

但我想要的是功能,feature.feature_values 也属于该产品,而不仅仅属于该功能。

如何实现我所需要的?

【问题讨论】:

    标签: laravel eloquent laravel-8


    【解决方案1】:

    由于您在产品和功能之间没有任何直接关系,因此您无法使用 Builder 关系方法来获取您想要实现的目标,因此我的解决方案是在您的 Product 模型中创建一个 mutator 来获取列表Feature 对象,例如 getFeaturesWithFeatureValueAttribute() 或其他东西。然后,在您的方法中,您可以稍后为 features 属性创建自己的对象格式。

    要使用该方法,您需要在JsonResource 类中调用它。您可以创建一个like this,然后在要返回的数组中定义要返回的属性和值。对于属性features,您只需将值设置为:

    $this->features_with_feature_value,

    或者像这样直接调用方法:

    $this->getFeaturesWithFeatureValueAttribute()(我个人建议您采用此选项,以防止将来出现混淆)。

    之后,您可以使用JsonResource 类从控制器返回数据,如文档所述。别担心,分页也能很好地工作!希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多