Php 仅使用最新记录的laravel查询联接

Php 仅使用最新记录的laravel查询联接,php,laravel,Php,Laravel,我使用的是Laravel 5.3,试图用它的产品和最新的订单以及最新的价格历史记录归还一笔盗窃。两个连接都不会返回任何内容,但如果我删除$q->latest()->first()并将其替换为一个简单的orderBy()I获取所有结果。我的问题是: $data = $heist->with(['product'=> function($query) { $query->with(['orders' => function($q) { return $q->

我使用的是Laravel 5.3,试图用它的产品和最新的订单以及最新的价格历史记录归还一笔盗窃。两个连接都不会返回任何内容,但如果我删除
$q->latest()->first()并将其替换为一个简单的
orderBy()
I获取所有结果。我的问题是:

$data = $heist->with(['product'=> function($query) {
  $query->with(['orders' => function($q) {
    return $q->latest()->first();
  }]);
  $query->with(['price_history' => function($q) {
    return $q->latest()->first();
  }]);
}])->orderBy('completed_at', 'DESC')->orderBy('active', 'DESC')->get();
调用first()与调用take(1)->get()[0]相同; 这意味着将返回的金额限制为1并返回。你想要的只是极限部分。因此,如果将first()改为(1)

更新

$data = $heist->with([
    'product'=> function($query) {
       $query->with(
            [
                'orders' => function($q) {
                   $q->latest()->take(1);
                },
                'price_history' => function($q) {
                   $q->latest()->take(1);
                }
            ]
        );
    }
])->orderBy('completed_at', 'DESC')->orderBy('active', 'DESC')->get();

正如评论中所讨论的,我认为最简单的方法是

$heists = $heist->with(['product'=> function($query) {
  $query->with([
    'orders' => function($q) {
      return $q->orderBy('created_at', 'desc')->take(1)->get();
    },
    'price_history' => function($q) {
      return $q->orderBy('created_at', 'desc')->take(1)->get();
    }
  ]);
}])->orderBy('completed_at', 'desc')->orderBy('active', 'desc')->get();

希望这有帮助:)

你有没有试过在最后像这样给出
first()
orderBy('active','DESC')->first()
?我正在尝试得到所有的抢劫,而不仅仅是第一次。我只想要最新的加入模型。那么,请重新格式化问题。上面说的是最新的record@Jongo你能把这些表之间的关系写下来吗?并对术语
latest
进行更多解释。。。正如@linuxartian所说,我相信,
orderBy('id','desc')
等于
latest()
Heist有一个产品,产品有多个订单,有多个价格历史。我尽量把问题弄清楚。我想要他们的所有产品,但只有最新的订单和最新的价格历史记录。希望这更有意义。这只适用于结果中的第一次抢劫-这与我使用$q->latest()->first()得到的结果类似。第一个结果的价格历史记录为空,结果中的所有其他抢劫都有订单,价格历史记录为空。@Jongo现在试试这个。我相信您不需要返回关系规则,也不需要调用
->get()
。如果您仍然得到相同的结果,您可以在查询的最后调用
->toSql()
而不是
->get()
,以便我们进一步调查。与下面相同的问题-它适用于第一次盗窃结果(适用于订单,但不适用于价格历史记录)但所有其他结果都有订单和价格历史的空数组。结果类似于:[{“id”:1,“product_id”:32594763262,“orders”:[{“id”:8827,“product_id”:32594763262,“created_at”:“2016-11-1404:43:50”,“updated_at”:“2016-11-1404:43:50”;“price_history”:[],{“id”:2,“product_id”:32742307067,“orders”:[],“price_history”:[]@Jongo如果订单表或价格历史记录中没有与特定
产品id
相关的行,则集合显然将为空。您是否正在尝试将任何产品的最新订单和价格历史记录保存到集合中?我正在尝试获取与之相关的产品的最新订单和价格历史记录,并且其中有行,因为如果我将联接查询更改为$q->orderBy('created_at','desc'))它工作并以正确的顺序返回所有相关行。这似乎是将其限制为导致问题的最新记录的原因。