Laravel删除多对多关系中的Pivot数据

时间:2014-12-12 11:51:57

标签: php laravel tags pivot-table

不确定我是否正确设置了它。在Laravel中,我创建了两个具有多对多关系的模型

模型为ItemTags。每个人都包含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"}}
    ]
}]

无论如何都要阻止这些数据进入

4 个答案:

答案 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');