Laravel Удаление данных Pivot во многих отношениях

Не уверен, правильно ли я это настроил. В 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

Решение

Вы спросили, и вы получите свой ответ. Но сначала несколько слов, чтобы подвести итог раздела комментариев. Я лично не знаю, почему вы хотите / должны это сделать. Я понимаю, если вы хотите скрыть это от вывода но не выбирать его из БД действительно не имеет никакой реальной выгоды. Конечно, будет передаваться меньше данных, и у сервера БД будет чуть-чуть меньше работы, но вы этого не заметите.

Однако это возможно. Это не очень красиво, так как вы должны переопределить 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');
}
}
7

Другие решения

Вы можете просто добавить имя поля в скрытой части вашей модели следующим образом:

защищенный $ hidden = [‘pivot’];

вот и все, со мной все работает.

2

По вопросам рекламы [email protected]