从两个表嵌套Laravel API搜索结果

时间:2018-07-21 12:22:17

标签: php mysql laravel

需要一些有关如何实现此目标的指导:

PHP 7.2,使用API​​资源的Laravel 5.6

我有一张位置表(位置名称,ID等)和一张报告表。一个(位置)到多个(报告)。我正在使用Searchy进行位置搜索。当我搜索位置时,我想在结果中包括也可用于该位置的所有报告。

我认为这是进行联接的一个很好的例子,但是Searchy无法进行联接,因此我正在尝试解决该问题。如果有更好的方法,我会全力以赴。顺便说一句,我是Laravel的新手,所以假设我一无所知。

        $response = Searchy::locations('location_name')->query($query)->get();

        // Add reports to array in each location result
        foreach($response->items as $location_row){
            $response->items[$location_row->location_id]->reports[] = Searchy::reports('location_id')->query($location_row->location_id)->get();
        }

        // Return the results

        return new LocationResource($response);

我得到的特定错误是items数组在Collection对象中不可用。是的,它只是私人的。告诉我我做错了。

附录:如果不是最佳途径,我正在使用Searchy进行模糊搜索,并且我有更好的选择。

编辑 响应对象(缩短):

object(Illuminate\Support\Collection)#497 (1) {
  ["items":protected]=>
  array(5) {
    [0]=>
    object(stdClass)#491 (10) {
      ["id"]=>
      int(235)
      ["locality_id"]=>
      string(32) "102938098209384"
      ["locality_name"]=>
      string(7) "AREA 1"
      ["location_name"]=>
      string(10) "Station 10"
      ["location_id"]=>
      string(32) "098098019823909"
      ["location_address"]=>
      string(21) "xx.xx.xx.xx"
      ["location_last_update"]=>
      string(19) "2018-03-30 00:00:00"
      ["created_at"]=>
      string(19) "2018-07-16 16:29:13"
      ["updated_at"]=>
      string(19) "2018-07-16 16:29:13"
      ["relevance"]=>
      string(2) "36"
    }
  }
}

1 个答案:

答案 0 :(得分:1)

还没有办法对其进行测试,但是尝试切换foreach周期,如下所示:

$response = Searchy::locations('location_name')->query($query)->get();
// Add reports to array in each location result
foreach($response as $locationKey => &$locationRow){
    $locationRow->reports[] = Searchy::reports('location_id')->query($location_row->location_id)->get();
}
// Return the results
return new LocationResource($response);

您可以做的一件事情来帮助您更好地可视化需求,即以Arrays的身份与他们一起工作,因此,您需要做的就是在{{ 1}}方法(->toArray()方法是一种获取数据并返回->get()get()collection转换为toArray的方法)

编辑:根据Searchy的说法,您可以操纵查询对象,所以我想您可以添加联接

  

如果要对结果做进一步的处理,可以使用getQuery()而不是get()返回数据库查询对象的实例

我认为在这种情况下,您可能会从EagerLoading中受益。不确定Searchy是否允许它,但是在查询方面,我通常会选择使用Laravel的ORM(如果可以的话),或者使用QueryBuilder将其写出来,这很简单

  

https://laravel.com/docs/5.6/eloquent-relationships#eager-loading

假设您有这两种模型,位置报告

collection

查询为:array