简体   繁体   中英

Laravel/Eloquent ORM - retrieve only referenced records

I have a many-to-many relationship which I resolved with an intersection table. So table A and B are connected through AxB. A and AxB are 1-n and B and AxB are 1-n.

The actual names of the tables:

   table A = extensiontables_registry
   table B = ad_groups
   table AxB = extensiontables_registryxad_groups

You can see the logical datamodel here: https://imgur.com/MNpC3XV

Ive put the part we are talking about right now into a red frame.

Now, I have the following line of code in my backend-API:

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

To keep things short, the $ids contains all the ids from "ad_groups". These I've gotten from a fetch which works as intended. The $ids contains these values/ids according to my logs:

[1,2,3,4,5,6,7,8,9,10,12]  

Now, the extensiontables_registryxad_groups currently looks like this:

 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)

And the extensiontables_registry looks like this:

+----+-----------------------+------------+------------+
| id | extensiontable_name   | created_at | updated_at |
+----+-----------------------+------------+------------+
|  1 | extensiontable_itc    | NULL       | NULL       |
|  2 | extensiontable_sysops | NULL       | NULL       |
|  3 | test                  | NULL       | NULL       |
+----+-----------------------+------------+------------+

And now the problem is that my codesnippet from above:

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

returns me this result:

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

So the codesnippet does NOT do what I want it to do. It should only fetch me the names of those extensiontables which have IDs which exist on the very same record(s) in extensiontables_registryxad_groups with IDs from my inputarray above. So The result I currently would expect would be this:

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

I am pretty new to laravel and eloquent, so I dont really know what I did wrong in my codesnippet. I also have no idea what I can do to get this working as intended ^^

For the sake of completeness, I'll show you my eloquent models/classes for this arrangement of tables, just in case you might need it:

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

I would be really thankful if you could help me or at least give me a hint what to look out for in order to find information on leveraging the methods of laravel/eloquent accordingly ^^ If you need any more info, ask right away:)

I think you got things a little mixed up.

what this query does:

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

is access the extensiontables_registry table and get records with the same array of $ids you sent.

But it will NOT take in consideration the relationship with extensiontables_registryxad_groups table because you didn't explicitly specify it in the query.

What you should add is has('relationship name') which get the records of this model that only has a corresponding Foreign key in relationship name' in your case Ad_groups

So in this case the query would look like this:

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

i think you can get there using 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();

please note you can avoid repeated results using 'distinct';

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM