Laravel/Eloquent ORM - 仅检索引用的记录
Posted
技术标签:
【中文标题】Laravel/Eloquent ORM - 仅检索引用的记录【英文标题】:Laravel/Eloquent ORM - retrieve only referenced records 【发布时间】:2020-08-24 04:05:45 【问题描述】:我有一个多对多的关系,我用交集表解决了这个关系。 所以表 A 和 B 通过 AxB 连接。 A 和 AxB 是 1-n,B 和 AxB 是 1-n。
表的实际名称:
table A = extensiontables_registry
table B = ad_groups
table AxB = extensiontables_registryxad_groups
您可以在此处查看逻辑数据模型: https://imgur.com/MNpC3XV
我已经把我们现在正在谈论的部分放在一个红框里。
现在,我的后端 API 中有以下代码行:
$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();
为了简短起见,$ids
包含来自“ad_groups”的所有 ID。这些我是从按预期工作的获取中获得的。
根据我的日志,$ids
包含这些值/ID:
[1,2,3,4,5,6,7,8,9,10,12]
现在,extensiontables_registryxad_groups 目前看起来像这样:
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)
extensiontables_registry 看起来像这样:
+----+-----------------------+------------+------------+
| id | extensiontable_name | created_at | updated_at |
+----+-----------------------+------------+------------+
| 1 | extensiontable_itc | NULL | NULL |
| 2 | extensiontable_sysops | NULL | NULL |
| 3 | test | NULL | NULL |
+----+-----------------------+------------+------------+
现在的问题是我上面的代码sn-p:
$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();
返回这个结果:
array (
0 => 'extensiontable_itc',
1 => 'extensiontable_sysops',
2 => 'test',
)
所以coden-p 并没有做我想做的事。它应该只为我获取那些具有 ID 的扩展表的名称,这些扩展表的 ID 存在于 extensiontables_registryxad_groups 中的相同记录上,其 ID 来自我上面的 inputarray。所以我目前期望的结果是这样的:
array (
0 => 'extensiontable_itc',
1 => 'extensiontable_sysops'
)
我对 laravel 和 eloquent 很陌生,所以我真的不知道我在我的 coden-p 中做错了什么。我也不知道我能做些什么来让它按预期工作^^
为了完整起见,我将向您展示我针对这种表格排列的雄辩的模型/类,以防您可能需要它:
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');
extensiontables_registry.php:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Extensiontables_Registry extends Model
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'Extensiontables_Registry';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'extensiontable_name'
];
/**
* Many-To-Many relationship with User-Model.
*/
public function Ad_groups()
return $this->belongsToMany('App\Ad_group', 'extensiontables_registryxad_groups');
如果您能帮助我,或者至少给我一个提示,以便找到相应地利用 laravel/eloquent 方法的信息,我将非常感激 ^^ 如果您需要更多信息,请正确提问离开:)
【问题讨论】:
【参考方案1】:我认为你把事情搞混了。
这个查询的作用:
$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();
访问extensiontables_registry
表并获取与您发送的$ids
数组相同的记录。
但它会不考虑与extensiontables_registryxad_groups
表的关系因为您没有在查询中明确指定它。
您应该添加的是has('relationship name')
,它获取此模型的记录,在您的情况下relationship name'
中只有一个对应的外键Ad_groups
所以在这种情况下,查询将如下所示:
$permittedTables = extensiontables_registry::has('Ad_groups')->pluck('extensiontable_name')->toArray();
【讨论】:
我目前在使用您的查询时收到此错误:“[2020-05-11 06:35:09] local.ERROR: PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column ' extensiontables_registryxad_groups.extensiontables__registry_id' in 'where clause' in E:\aether-backend\vendor\illuminate\database\Connection.php:331 " 另外,您的查询不使用我的一组 ID。我不想从注册表中获取引用组记录的所有记录。相反,只有那些来自注册表的记录引用来自 $ids 数组中具有这些特定 ID 之一的组的记录 @Narktor 你在extensiontables__registry_id
中有两个下划线在extensionables
之后有一个错字,因为laravel 会自动为关系键添加一个额外的下划线,所以你需要在关系中手动指定外键在您的模型 extensiontables_registry 和 AD_Group 之间,docs 将为您提供帮助。
@Narktor 关于$ids
,您可以在查询中添加whereIn('id',$ids)
子句以过滤所需的$ids
。【参考方案2】:
我认为您可以使用 join 到达那里:
$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' 避免重复结果;
【讨论】:
目前我的代码出现此错误:“local.ERROR: BadMethodCallException: Method Illuminate\Database\Eloquent\Collection::Ad_groups 不存在。在 E:\aether-backend\vendor\illuminate \support\Traits\Macroable.php:103 " 我认为我们可以进一步简化事情......使用直接方式,我已经更新了我的答案,如果有帮助请告诉我以上是关于Laravel/Eloquent ORM - 仅检索引用的记录的主要内容,如果未能解决你的问题,请参考以下文章