Php 如何有效地只选择一个属于多个关系的标识?

Php 如何有效地只选择一个属于多个关系的标识?,php,mysql,laravel,laravel-4,eloquent,Php,Mysql,Laravel,Laravel 4,Eloquent,如果我有一个Users表和Tags表,并且一个pivot表属于多个关系,那么如何使用Eloquent只加载关系的id 如果我使用('tags')User::with('tags'),这将在pivot表和tags表上进行连接。但是,在我的例子中,这是不必要的,效率也很低,因为我希望只能从透视表中选择标记的ID,而不能选择标记表中的其他列。换句话说,我只想让它做一个从用户到用户的连接 谢谢。试一试(未测试): 或者类似的事情(但是在标记调用期间执行一些额外的查询): 更新:(另一种方式) 好的,因为

如果我有一个Users表和Tags表,并且一个pivot表属于多个关系,那么如何使用Eloquent只加载关系的id

如果我使用('tags')
User::with('tags')
,这将在pivot表和tags表上进行连接。但是,在我的例子中,这是不必要的,效率也很低,因为我希望只能从透视表中选择标记的ID,而不能选择标记表中的其他列。换句话说,我只想让它做一个从用户到用户的连接

谢谢。

试一试(未测试):

或者类似的事情(但是在
标记
调用期间执行一些额外的查询):

更新:(另一种方式)


好的,因为@WereWolf的建议是不正确的(第一个会导致错误,第三个可能是错误的,如果有自定义密钥),这里是为您提供的选项,不获取相关模型

从最明显的问题开始:

// for single model:
$user = User::first();
$user->tags()->allRelatedIds(); // select id from related table -> join
这是您可以使用的,但它不是答案,因为您希望加载这些ID

也就是说,您需要为透视表创建另一个模型:

// UserTag model
protected $table = 'user_tag';

// this is not required, just to make it read-only
public static function boot()
{
   parent::boot();
   static::saving(function() {
     return false;
   }
}

// User model
public function tagsPivot()
{
   return $this->hasMany('UserTag')->select('tag_id', 'user_id'); // appropriate keys here
}

public function getTagsIds()
{
   return $this->tagsPivot->lists('tag_id');
}

// then you can do this:
$users = User::with('tagsPivot')->get(); // no join, select category_id from pivot table

foreach ($users as $user)
{
   $user->getTagsIds();
}


您还可以根据自己的喜好对用户模型进行一些更改:

// to be able to do this:
$users = User::with('tagsIds')->get();

foreach ($users as $user)
{
   $user->tagsIds;
}

// User model
public function tagsIds()
{
   return $this->hasMany('UserTag')->select('tag_id', 'user_id'); // appropriate keys here
}

public function getTagsIdsAttribute()
{
   if ( ! array_key_exists('tagsIds', $this->relations)) $this->load('tagsIds');

   return $this->getRelation('tagsIds')->lists('tag_id');
}

您想在多个模型上加载这些ID吗?是的,我想对多个模型(集合)或单个模型执行此操作。谢谢。如果不加入透视表,您将无法获得相关标记,因为关系存储在透视表中。@WereWolf TheAlpha是的,我想将透视表(Users\u标记)与Users表合并。不是包含透视表的标记表。要加载这种关系,透视表需要单独的模型。虽然这不应该是一个问题,但最终可能会出现不一致的结果,因为可能会有一些已删除的标记在透视表上仍然有行。是的,这就是我的建议(
$user->tags()
当然可以,不需要调用查询,也不能调用该查询上的关系;),因为,就像我对这个问题的评论一样,只查询pivot表可能会出现不一致。我不知道getRelatedIds()方法。不幸的是,getRelation()方法不允许对用户进行任何约束,因此它只对整个用户表起作用。第二种方法可以工作,但仍然对Tags表执行冗余查询。我还假设我所做的不能用于收集?你可能会认为这是一个内置的口才,因为只获取相关的ID是相当常见的。是的,第二个会进行额外的查询,如果我们可以作为一个
内置的
功能轻松地做类似的事情会更好,也许有一种方法,但还没有公开,最好的:-)。@狼人TheAlpha感谢你的时间!我会继续挖掘。非常欢迎你,如果你发现了什么,请不要忘记分享,希望你能想出一些有趣的东西:-)太好了,非常感谢你的努力!我一定会用这个
GetRelatedId
最近被重命名为
AllRelatedId
// for single model:
$user = User::first();
$user->tags()->allRelatedIds(); // select id from related table -> join
// UserTag model
protected $table = 'user_tag';

// this is not required, just to make it read-only
public static function boot()
{
   parent::boot();
   static::saving(function() {
     return false;
   }
}

// User model
public function tagsPivot()
{
   return $this->hasMany('UserTag')->select('tag_id', 'user_id'); // appropriate keys here
}

public function getTagsIds()
{
   return $this->tagsPivot->lists('tag_id');
}

// then you can do this:
$users = User::with('tagsPivot')->get(); // no join, select category_id from pivot table

foreach ($users as $user)
{
   $user->getTagsIds();
}
// to be able to do this:
$users = User::with('tagsIds')->get();

foreach ($users as $user)
{
   $user->tagsIds;
}

// User model
public function tagsIds()
{
   return $this->hasMany('UserTag')->select('tag_id', 'user_id'); // appropriate keys here
}

public function getTagsIdsAttribute()
{
   if ( ! array_key_exists('tagsIds', $this->relations)) $this->load('tagsIds');

   return $this->getRelation('tagsIds')->lists('tag_id');
}