Не уверен, правильно ли я это настроил. В 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"}}
]
}]
Есть ли способ предотвратить попадание этих данных в
Вы спросили, и вы получите свой ответ. Но сначала несколько слов, чтобы подвести итог раздела комментариев. Я лично не знаю, почему вы хотите / должны это сделать. Я понимаю, если вы хотите скрыть это от вывода но не выбирать его из БД действительно не имеет никакой реальной выгоды. Конечно, будет передаваться меньше данных, и у сервера БД будет чуть-чуть меньше работы, но вы этого не заметите.
Однако это возможно. Это не очень красиво, так как вы должны переопределить 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');
}
}
Вы можете просто добавить имя поля в скрытой части вашей модели следующим образом:
защищенный $ hidden = [‘pivot’];
вот и все, со мной все работает.