php嵌套两个表的LaravelAPI搜索结果

9o685dep  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(277)

需要一些指导来解决这个问题:
使用api资源的PHP7.2、Laravel5.6
我有一个位置表(位置名称、id等)和一个报告表。一(位置)对多(报告)。我用searchy搜索位置。当我搜索某个位置时,我希望在结果中包含该位置也可用的任何报告。
我相信这是一个很好的连接案例,但是searchy不能做连接,所以我正在努力解决这个问题。如果有更好的办法,我洗耳恭听。顺便说一句,我是新来拉威尔,所以假设我什么都不知道。

$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 数组,在集合对象中不可用。是的,只是私人的。这说明我做错了。
附录:我使用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"
    }
  }
}
5vf7fwbs

5vf7fwbs1#

没有办法测试它,但是尝试切换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 ,然后你只需要添加 ->toArray() 在比赛结束时 ->get() 方法( get() 方法是获取数据并返回 collection , toArray 转换 collection 变成一个 array )
编辑:根据searchy,您可以操作查询对象,因此我猜您可以添加连接
您可以使用getquery()而不是get()来返回数据库查询对象的示例,以防对结果进行进一步操作
我想在这种情况下,你可能会从中受益。不确定searchy是否允许,但当涉及到查询时,我通常要么选择使用laravel的orm(如果可以的话),要么用querybuilder把它们写出来,这很简单
https://laravel.com/docs/5.6/eloquent-relationships#eager-正在加载
假设你有这两个模型,位置和报告

class Location extends Model
{
    protected $fillable = [/*An array that contains a list of fields of your table*/];
    //When you do Locations::create($arrayOfData);, Laravel will do insert into ($fillables) values ($arrayOfData). 

    //Hidden means they'll be hidden whenever you fetch an object type of Location
    protected $hidden = ["created_at","updated_at"];

    //Here, we establish a relationship this model has to reports
    //You can further down and set custom to what are the foreign keys and local keys on the link above
    public function reports()
    {
      return $this->hasMany("App\Models\Report");
    }
}

class Report extends Model {
    protected $fillable =['id','location_id',...];
    protected $hidden = ["created_at","updated_at"];

    public function reports() {
          return $this->belongsTo("App\Models\Location");
    }
}

查询将是: Location::with('report')->get();

相关问题