Laravel / Eloquent ORM - получать только записи, на которые есть ссылки - PullRequest
1 голос
/ 08 мая 2020

У меня есть отношение «многие ко многим», которое я разрешил с помощью таблицы пересечений. Таким образом, таблицы 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

Я положил часть, которую мы говорим прямо сейчас в красную рамку.

Теперь у меня есть следующая строка кода в моем backend-API:

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

Короче говоря, $ids содержит все идентификаторы из «ad_groups». Я получил их из выборки, которая работает как задумано. $ids содержит следующие значения / идентификаторы согласно моим журналам:

[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',
)  

Итак, кодовый сниппет НЕ делает то, что я хочу это делать. Он должен получать мне только имена тех таблиц расширения, идентификаторы которых существуют в той же записи (ах) в extensiontables_registryxad_groups с идентификаторами из моего входного массива выше. Итак, результат, которого я сейчас ожидал, будет следующим:

 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 / eloquent соответственно ^^ Если вам нужна дополнительная информация, спросите сразу :)

Ответы [ 2 ]

1 голос
/ 08 мая 2020

я думаю, вы можете добраться туда с помощью 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();

обратите внимание, что вы можете избежать повторяющихся результатов с помощью 'отличного';

1 голос
/ 08 мая 2020

Я думаю, вы немного перепутали.

что делает этот запрос:

$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();
...