需要一些有关如何实现此目标的指导:
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"
}
}
}
答案 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