不确定我是否正确设置了它。在Laravel中,我创建了两个具有多对多关系的模型
模型为Item
和Tags
。每个人都包含belongsTo
到另一个。
当我运行这样的查询时:
Item::with('tags')->get();
它返回items
的集合,每个项目都包含tags
集合。但是,集合中的每个标记还包含我不需要的pivot
数据。这是json格式:
[{
"id":"49",
"slug":"test",
"order":"0","tags":[
{"id":"3","name":"Blah","pivot":{"item_id":"49","tag_id":"3"}},
{"id":"13","name":"Moo","pivot":{"item_id":"49","tag_id":"13"}}
]
}]
无论如何都要阻止这些数据进入
答案 0 :(得分:8)
你问过,你会得到答案。但首先要总结一下评论部分。我个人不知道为什么你会想要/需要这样做。我理解你是否想hide it from the output但是没有从数据库中选择它真的没有真正的好处。当然,传输的数据越少,数据库服务器的工作量就会越来越少,但你不会以任何方式注意到这一点。
但是有可能。但它不是很漂亮,因为你必须覆盖belongsToMany
类。
首先,新的关系类:
class BelongsToManyPivotless extends BelongsToMany {
/**
* Hydrate the pivot table relationship on the models.
*
* @param array $models
* @return void
*/
protected function hydratePivotRelation(array $models)
{
// do nothing
}
/**
* Get the pivot columns for the relation.
*
* @return array
*/
protected function getAliasedPivotColumns()
{
return array();
}
}
正如您所看到的,这个类重写了两个方法。 hydratePivotRelation
通常会创建数据透视模型并用数据填充它。 getAliasedPivotColumns
将返回所有列的数组,以便从数据透视表中进行选择。
现在我们需要将它集成到我们的模型中。我建议您使用BaseModel
类,但它也可以在模型中直接使用。
class BaseModel extends Eloquent {
public function belongsToManyPivotless($related, $table = null, $foreignKey = null, $otherKey = null, $relation = null){
if (is_null($relation))
{
$relation = $this->getBelongsToManyCaller();
}
$foreignKey = $foreignKey ?: $this->getForeignKey();
$instance = new $related;
$otherKey = $otherKey ?: $instance->getForeignKey();
if (is_null($table))
{
$table = $this->joiningTable($related);
}
$query = $instance->newQuery();
return new BelongsToManyPivotless($query, $this, $table, $foreignKey, $otherKey, $relation);
}
}
为简洁起见,我对评论进行了编辑,但该方法与belongsToMany
中的Illuminate\Database\Eloquent\Model
类似。当然除了创建的关系类。在这里,我们使用自己的BelongsToManyPivotless
。
最后,这就是你如何使用它:
class Item extends BaseModel {
public function tags(){
return $this->belongsToManyPivotless('Tag');
}
}
答案 1 :(得分:3)
您可以在模型的隐藏部分添加字段名称,如下所示:
protected $ hidden = [' pivot'];
它,它适用于我。
答案 2 :(得分:0)
如果要删除数据透视表,则可以按照protected $hidden = ['pivot'];
@Amine_Dev的建议使用,因此我已经使用了它,但是它对我不起作用,
但是问题确实是我在错误的模型中使用了它,所以我想在其中提供更多详细信息,以便在哪里使用它,这样你们就不会遇到我所遇到的问题了。
因此,如果您以以下方式获取数据:
Item::with('tags')->get();
然后,您必须将数据透视表分配给隐藏数组,如下所示
但是请记住,您必须在Tag
模型中定义它,而不是Item
模型中
class Tag extends Model {
protected $hidden = ['pivot'];
}
答案 3 :(得分:0)
两种可能的方法来做到这一点
1.在结果模型上使用 makeHidden 方法
$items = Item::with('tags')->get();
return $items->makeHidden(['pivot_col1', 'pivot_col2']...)
2.使用PHP的array_column函数
$items = Item::with('tags')->get()->toArray();
return array_column($items, 'tags');