2016-05-13 6 views
1

У меня есть две модели с взаимосвязь между многими объектами: User и Post. Мне нужно получить все записи сводной таблицы сообщений. Как я могу это достичь? Например:Как для массового выбора только сводные таблицы с использованием Eloquent?

$user->posts()->pivot()->get(); // I need to do something like this 

Причина, по которой мне это нужно, - выполнить массовое обновление в одном запросе на этих опорных точках. Пример иллюстраций:

// set 'times_seen' to 100 for all of the pivot records 
$user->posts()->pivot()->update(['times_seen' => 100]); 
+1

Что сводные таблицы? У вас есть только одна сводная таблица. Что именно вы пытаетесь достичь? –

+0

Я хочу выбрать все ** записи ** сводной таблицы –

+0

Вам нужны только идентификаторы, а также коллекции моделей User and Post? –

ответ

1

Ваш вопрос не совсем ясен, я не уверен, что вам действительно нужно, пожалуйста, предоставьте более подробную информацию.

Данные поворота таблицы доступна в $ шарнира атрибута соответствующей модели, так что вы можете получить доступ к нему со следующим:

foreach ($user->posts as $post) { 
    echo $post->pivot->someFieldFromPivotData; 
} 

Вы можете найти более подробную информацию о том, как работать с сводными таблицами в документации: https://laravel.com/docs/5.1/eloquent-relationships#many-to-many

наиболее эффективный способ обновить все связанные строки шарнирные, чтобы непосредственно работать на этой таблице:

// to set to fixed value 
DB::table('pivot_table_name')->where('user_id', $user->id)->update(['times_seen' => 1]); 

// to increment by one 
DB::table('pivot_table_name')->where('user_id', $user->id)->increment('times_seen'); 
+0

Я хочу, чтобы массовые обновления сводных записей в одном запросе sql. Итерация по каждому из них будет неэффективной. –

+0

Что вы хотите обновить в сводной таблице? –

+0

Например: поле 'times_seen' –

1

В сводной таблице обычно используется только два внешних ключа, используемых для подключения двух моделей. Если вам нужно получить все сообщения указанного пользователя, вы можете сделать это с помощью $user->posts().

Я хочу, чтобы массовое обновление сводных записей в одном запросе sql. Перебор каждый из них был бы неэффективным

Если вас правильно понял, вы хотите использовать attach(), detach() и sync() с массивом:

$user->roles()->detach([1, 2, 3]); 

$user->roles()->attach([1, 2, 3]); 

$user->roles()->sync([1, 2, 3]); 

https://laravel.com/docs/5.1/eloquent-relationships#inserting-many-to-many-relationships

+0

Спасибо за ответ, но это не то, что я ищу. Я хочу, например, обновить поле 'times_seen' для каждого свода. –

+0

Нажмите на ссылку в моем ответе. Вы можете сделать '$ user-> role() -> attach ([1 => ['expires' => $ expires], 2, 3]);' и, я думаю, это именно то, что вы хотите. –

+0

Извините, я думаю, я был довольно расплывчатым с моим вопросом. Спасибо за ваше время –

Смежные вопросы