php 在Laravel Eloquent中的JOIN中使用作用域

dm7nw8vv  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(133)

我正在尝试获取具有有效价格的所有产品,并使用 * ProductPrices Model * 中的范围显示它们和有效价格。我的 * Products Model * 与价格具有hasMany关系:

    • 产品名称. php**(型号)
public function prices () {
  return $this->hasMany(ProductsPrice::class);
}

我的 * 价格模型 * 具有一个有效范围,用于检查价格在此日期是否有效:

    • 产品价格. php**(型号)
public function scopeIsActive($query)
  {
    return $query->whereRaw(' timestampdiff(second, start_time, NOW()) >= 0')
                 ->where(function ($query) {
                    $query->whereRaw(' timestampdiff(second, end_time, NOW()) <= 0')
                       ->orWhereNull('end_time');
                  });
}

我尝试了许多不同的方法来获得具有活跃价格的产品并同时展示它们。我觉得应该起作用但没有起作用的事情是:

Route::get('/test', function (Request $request) {
  return Product::join('products_prices', 'products.id', 'products_prices.product_id')
      ->prices->isActive()
      ->where('products.is_active', true)
      ->get();
});

我得到错误:
属性[prices]在Eloquent生成器示例上不存在。

    • 或测试2**
Route::get('/test2', function (Request $request) {
  $prices = DB::table('products_prices')->select('id');
  $product = Product::whereIn('id', $prices)->get();

  return $product->prices()->isActive()->get();
});

我得到错误:
您访问的页面不存在!
为什么我无法访问 * Product Model * 上的-〉prices()?我是否应该使用profulent并使用Laravel的Query Builder?

tkclm6bt

tkclm6bt1#

我认为withwhereHas的组合可能有效:

$products = Product::with(['prices' => function($query) {
    $query->isActive(); // to fetch prices relation that is active
}])->whereHas('prices', function($query) {
    $query->isActive(); // this one is to filter the products that has active price
})->get();

相关问题