如何解决为什么这个Laravel雄辩的查询会返回更多对象?
我试图雄辩地找回一个与Laravel中的其他模型有关系的模型,但是我的查询不起作用。我想做的只是 显示带有相关组,单元和相关组件的dataLog并将其作为对象返回。参数$ componentId是唯一应该返回的组件,但它会返回其他 组件ID,组和单位。有没有办法只显示具有给定参数componentId的组件,而跳过其余不相关的组件?
<?
public function getLogData( $componentId,$limit ) {
$dataLogs = Log::whereHas( 'groups',function( $group ) use (&$componentId) {
$group->whereHas( "units",function( $unit ) use (&$componentId) {
$unit->whereHas( "components",function( $component ) use (&$componentId) {
$component->where( "Component",$componentId );
} );
} );
} )->take( $limit )->get();
return response( )->json( $dataLogs );
}
?>
回复是
[
{
"Oid": 10409376,"Active": false,"Speed": "0","Weight": "0","Amount": "0","Code": "","Control": false,"Type": 1,"Event": 1,"Name": "TestName","Number": "","Mode": 0,"Recipe": "","DateTime": "2020-03-02 11:09:37.177","Check": 288,"groups": [
{
"Oid": 11162074,"Amount": "3.387","Cap": "0","ActTachoVoltage": "0","Act": "0","Weight": "497717","Codes": "","Name": "Group1","units": [
{
"Oid": 15934577,"Counter": 0,"components": [
{
"oId": 18168546,"component": 1102,"Entry": 15934577
}
]
},{
"Oid": 15934578,"component": 1101,}
]
给定查询所需的响应
[
{
"Oid": 10409376,"components": [
{
"Oid": 15934578,}
]
如果给定的参数id是1101。有人知道我在做什么错吗?
模型和关系飞船
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class log extends Model
{
// Define variables
protected $primaryKey = 'Oid';
protected $table = 'log';
protected $connection = 'testdb';
protected $appends = [ 'groups' ];
// Functions
public function getGroupsAttribute( )
{
if( $this->groups() )
return $this->groups()->get();
return [];
}
// Define model relationship logEntry = FK from log to group model
public function groups(){
return $this->hasMany(groupLog::class,'logEntry');
}
}
?>
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class groupLog extends Model
{
// Define variables
protected $primaryKey = 'Oid';
protected $table = 'groupLog';
protected $connection = 'testdb';
// Functions
public function getUnitsAttribute( )
{
if( $this->units() )
return $this->units()->get();
return [];
}
// Define database relationships
public function log(){
return $this->belongsTo(log::class);
}
// Define model relationship groupEntry = FK from log to group model
public function units(){
return $this->hasMany(unitLog::class,'groupEntry');
}
}
?>
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class unitLog extends Model
{
// Define variables
protected $primaryKey = 'Oid';
protected $table = 'unitLog';
protected $connection = 'testdb';
protected $appends = [ 'components' ];
// Functions
public function getComponentsAttribute( )
{
if( $this->components() )
return $this->components()->get();
return [];
}
// Database relationships with models
public function group(){
return $this->belongsTo(groupLog::class);
}
public function components(){
return $this->hasMany(componentLog::class,'unitEntry');
}
}
?>
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class componentLog extends Model
{
// Define variables
protected $primaryKey = 'Oid';
protected $table = 'componentLog';
protected $connection = 'testdb';
// Define model database relationships
public function units(){
return $this->belongsTo(unitLog::class);
}
}
?>
像这样尝试答案的方法
$machineLogs = MachineLog::whereHas( 'groups',function($group) use ($componentId) {
$group->whereHas( "units",function( $unit ) use ($componentId) {
$unit->whereHas( "components",function( $component ) use ($componentId) {
$component->where("component",$componentId);
} );
} );
} );
$filterComponents = $machineLogs->with(['groups.units.components' => function ($query) use ($componentId) {
$query->where('component',$componentId);
}])->take($limit)->get();
return response( )->json( $filterComponents );
解决方法
您正在查询具有给定单位的Log,并且无论它们具有什么ID,它将始终返回所有单位。您正在寻找的是使用with()
来过滤关系。我仍然会使用您的完整查询,以获取正确的注销信息。
Log::yourQueries() // insert your existing queries here.
->with('groups.units.components' => function ($query) use ($componentId) {
$query->where('component',$componentId);
});
这将预加载组件并通过给定查询对其进行过滤,这将返回您的预期结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。