Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel/Elount ORM-仅检索引用的记录_Php_Laravel_Eloquent_Orm_Lumen - Fatal编程技术网

Php Laravel/Elount ORM-仅检索引用的记录

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

我有一个多对多关系,我用一个交集表解决了这个关系。 所以表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中有以下代码行:

$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中,“我认为我们可以简化一些事情……使用直接方式,我已经更新了我的答案,如果有帮助,请告诉我。”