Php Laravel/Elount ORM-仅检索引用的记录
我有一个多对多关系,我用一个交集表解决了这个关系。 所以表A和表B是通过AxB连接的。 A和AxB为1-n,B和AxB为1-n 表的实际名称:Php Laravel/Elount ORM-仅检索引用的记录,php,laravel,eloquent,orm,lumen,Php,Laravel,Eloquent,Orm,Lumen,我有一个多对多关系,我用一个交集表解决了这个关系。 所以表A和表B是通过AxB连接的。 A和AxB为1-n,B和AxB为1-n 表的实际名称: table A = extensiontables_registry table B = ad_groups table AxB = extensiontables_registryxad_groups 您可以在此处看到逻辑数据模型: 我把我们现在谈论的部分放在了一个红框里 现在,我的后端API中有以下代码行: $permitted
table A = extensiontables_registry
table B = ad_groups
table AxB = extensiontables_registryxad_groups
您可以在此处看到逻辑数据模型:
我把我们现在谈论的部分放在了一个红框里
现在,我的后端API中有以下代码行:
$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();
简而言之,$ids
包含来自“广告组”的所有ID。这些是我从一个按计划工作的地方得到的。
根据我的日志,$id
包含以下值/id:
[1,2,3,4,5,6,7,8,9,10,12]
现在,extensiontables_registryxad_组当前看起来如下所示:
select * from extensiontables_registryxad_groups;
+-----------------------------+-------------+------------+------------+
| extensiontables_registry_id | ad_group_id | created_at | updated_at |
+-----------------------------+-------------+------------+------------+
| 1 | 8 | NULL | NULL |
| 2 | 8 | NULL | NULL |
+-----------------------------+-------------+------------+------------+
2 rows in set (0.000 sec)
+----+-----------------------+------------+------------+
| id | extensiontable_name | created_at | updated_at |
+----+-----------------------+------------+------------+
| 1 | extensiontable_itc | NULL | NULL |
| 2 | extensiontable_sysops | NULL | NULL |
| 3 | test | NULL | NULL |
+----+-----------------------+------------+------------+
$permittedTables = extensiontables_registry::has('Ad_groups')->pluck('extensiontable_name')->toArray();
extensiontables\u注册表如下所示:
select * from extensiontables_registryxad_groups;
+-----------------------------+-------------+------------+------------+
| extensiontables_registry_id | ad_group_id | created_at | updated_at |
+-----------------------------+-------------+------------+------------+
| 1 | 8 | NULL | NULL |
| 2 | 8 | NULL | NULL |
+-----------------------------+-------------+------------+------------+
2 rows in set (0.000 sec)
+----+-----------------------+------------+------------+
| id | extensiontable_name | created_at | updated_at |
+----+-----------------------+------------+------------+
| 1 | extensiontable_itc | NULL | NULL |
| 2 | extensiontable_sysops | NULL | NULL |
| 3 | test | NULL | NULL |
+----+-----------------------+------------+------------+
$permittedTables = extensiontables_registry::has('Ad_groups')->pluck('extensiontable_name')->toArray();
现在的问题是我上面的代码片段:
$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();
将此结果返回给我:
array (
0 => 'extensiontable_itc',
1 => 'extensiontable_sysops',
2 => 'test',
)
因此,代码片段没有完成我希望它完成的任务。它应该只获取那些具有ID的扩展表的名称,这些ID存在于具有上述输入阵列ID的extensiontables\u registryxad\u组中的同一记录上。因此,我目前预期的结果是:
array (
0 => 'extensiontable_itc',
1 => 'extensiontable_sysops'
)
我对laravel很陌生,而且口才很好,所以我真的不知道我在代码片段中做错了什么。我也不知道我能做些什么来让它按预期工作^^
为了完整起见,我将向您展示我的雄辩模型/类,以备您可能需要:
AD_Group.php:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Ad_group extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name'
];
/**
* Hides pivot from return queries.
*
* @var array
*/
protected $hidden = [
'pivot'
];
/**
* Many-To-Many relationship with User-Model.
*/
public function Ad_users()
{
return $this->belongsToMany('App\Ad_user', 'Ad_usersxad_groups', 'Ad_group_id', 'Ad_user_id');
}
public function extensiontables()
{
return $this->belongsToMany('App\extensiontables_registry', 'extensiontables_registryxad_groups');
}
}
我想你把事情搞混了
此查询的作用是:
$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();
正在访问extensiontables\u注册表
表,并获取与您发送的$id
相同数组的记录
但是它将不考虑与可扩展表\u注册表xad\u组的关系表,因为您没有在查询中明确指定它
您应该添加的是has('relationship name')
,它获取此模型的记录,在您的案例Ad\u组中,该记录在relationship name'
中只有一个对应的外键
因此,在本例中,查询如下所示:
select * from extensiontables_registryxad_groups;
+-----------------------------+-------------+------------+------------+
| extensiontables_registry_id | ad_group_id | created_at | updated_at |
+-----------------------------+-------------+------------+------------+
| 1 | 8 | NULL | NULL |
| 2 | 8 | NULL | NULL |
+-----------------------------+-------------+------------+------------+
2 rows in set (0.000 sec)
+----+-----------------------+------------+------------+
| id | extensiontable_name | created_at | updated_at |
+----+-----------------------+------------+------------+
| 1 | extensiontable_itc | NULL | NULL |
| 2 | extensiontable_sysops | NULL | NULL |
| 3 | test | NULL | NULL |
+----+-----------------------+------------+------------+
$permittedTables = extensiontables_registry::has('Ad_groups')->pluck('extensiontable_name')->toArray();
我想你可以通过加入:
$permittedTables = extensiontables_registry::whereIn('id', $ids)
->join('extensiontables_registryxad_groups','extensiontables_registryxad_groups'.'extensiontables_registry_id','extensiontables_registry.id')
->select('extensiontables_registry.extensiontable_name')->get()->all();
请注意,您可以使用“distinct”避免重复结果 我目前在使用您的查询时遇到此错误:“[2020-05-11 06:35:09]local.error:PDOException:SQLSTATE[42S22]:未找到列:1054未知列“extensiontables\u registryxad\u groups.extensiontables\u registry\u id”在E:\Ether backend\vendor\light\database\Connection.php:331中的where子句中,您的查询不使用我的ID集。我不想从注册表中获取引用组记录的所有记录。相反,只有来自注册表的记录引用来自组的记录,这些组具有$IDs中的一个特定IDarray@Narktor您在extensionables\uuu注册表\u id
中有一个输入错误,在extensionables
之后有两个分数不足,因为laravel会自动向关系键添加一个额外的下划线,因此,您需要在models extensiontables\u registry&AD\u组之间的关系中手动指定外键,这将对您有所帮助。@Narktor关于$ids
您可以在查询中添加,其中('id',$ids)
子句,以过滤所需的$ids
。目前,我在您的代码中遇到此错误:“local.ERROR:BadMethodCallException:Method\Database\Eloquent\Collection::Ad_组不存在。在E:\Ether backend\vendor\illumb\support\Traits\Macroable.php:103中,“我认为我们可以简化一些事情……使用直接方式,我已经更新了我的答案,如果有帮助,请告诉我。”