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

问题描述 投票:1回答:2

我有一个多对多关系,我用一个交集表解决了。因此,表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       |
+----+-----------------------+------------+------------+

现在的问题是我上面的代码片段:

$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();

返回此结果:

 array (
  0 => 'extensiontable_itc',
  1 => 'extensiontable_sysops',
  2 => 'test',
)  

因此,代码片段没有执行我想要的操作。它应该只获取那些扩展名的名称,这些扩展名具有与存在于我上面的inputarray中的ID相同的extensiontables_registryxad_groups中的相同记录中的ID。所以我目前期望的结果是:

 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');
  }

}

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 /雄辩方法的信息的信息,我将非常感谢^^如果您需要更多信息,请立即询问:)

php laravel eloquent orm lumen
2个回答
0
投票

我认为您觉得事情有些混乱。

此查询的作用:

$permittedTables = extensiontables_registry::findMany($ids)->pluck('extensiontable_name')->toArray();

正在访问extensiontables_registry表并获取与您发送的$ids相同数组的记录。

但是它将NOT考虑与extensiontables_registryxad_groups表的关系因为您没有在查询中明确指定它。”>

您应该添加的是has('relationship name'),它获取该模型的记录,在您的情况下relationship name',该模型在Ad_groups中仅具有对应的外键

因此,在这种情况下,查询将如下所示:

$permittedTables = extensiontables_registry::has('Ad_groups')->pluck('extensiontable_name')->toArray();

0
投票

您可以使用'newPivotQuery'方法为数据透视表创建新的查询构建器:

© www.soinside.com 2019 - 2024. All rights reserved.