2015-11-05 5 views
8

Я новичок в laravel. Я работаю над приложением laravel 5, и я застрял здесь. У меня есть 2 модели, как, например:Как обновить сводную таблицу с использованием Eloquent в laravel 5

class Message extends Eloquent{ 

    public function user() 
    { 
     return $this->belongsTo('App\User', 'from'); 
    } 

    public function users() 
    { 
     return $this->belongsToMany('App\User')->withPivot('status'); 
    } 
} 

class User extends Eloquent { 

    public function messages() 
    { 
     return $this->hasMany('App\Message', 'from'); 
    } 

    public function receive_messages() { 
     return $this->belongsToMany('App\Message')->withPivot('status'); 
    } 
} 

Там существуют многие-ко-многим между Message и Пользователем дает мне сводную таблицу, как, например:

Table Name: message_user 
Colums: 
message_id 
user_id 
status 

У меня есть запрос SQL, как, например:

update message_user 
set status = 1 
where user_id = 4 and message_id in (select id from messages where message_id = 123) 

Как я могу перевести этот запрос в эквивалент laravel?

+0

Чувак, что вы подразумеваете под 'from'? –

+0

Внешний ключ @Mohamed –

+0

чувак второй аргумент - имя таблицы соединений, в вашем примере это должно быть «message_user», полное соотношение прав для ** сообщений ** в ** Пользователь ** модель: 'return $ this- > hasMany ('App \ Message \,' message_user ',' user_id ',' message_id '); ' –

ответ

7

Код ниже решить мой проблема:

$messages = Message::where('message_id', $id)->get(); 
foreach($messages as $message) 
    $message->users()->updateExistingPivot($user, array('status' => 1), false); 
-1

Для обновления сводной таблицы вы можете использовать метод updateExistingPivot.

+0

Спасибо @Babar. Можете ли вы добавить какой-либо пример кода, как я могу использовать метод, чтобы прийти с запросом на сообщение. –

+0

Вы можете увидеть документацию по адресу http://laravel.com/docs/5.0/eloquent#working-with-pivot-tables Код ссылки для этого Пользователь :: find (1) -> role() - > updateExistingPivot ($ roleId, $ attributes); –

3

Вы можете использовать на этих двух функций, sync()attach() и почтительность в двух словах, что синхронизация будет получить массив в качестве первого аргумента и синхронизировать его с поворотным столом (удалить и добавить пропущенные ключи в массиве) это означает, что если вы получили 3,2,1, как оцененный в вашей таблице соединений, и передали синхронизацию со значениями 3,4,2, синхронизация автоматически удалит значение 1 и добавит для вас значение 4. где Attach будет принимать единственное значение ID

ГИСТ: если вы хотите добавить дополнительные значения в вашей распределительной таблицы, передать его в качестве второго аргумента Sync() так:

$message = Messages::where('id','123'); 
$user = User::where('id','4'); 

// using ->attach for single message 
$user->message()->attach($message->id,['status' => 1 ]); 



// using ->sync for multiple messages 
$message2 = Messages::where('id','456'); // for testing 
$user->message()->sync([$message->id =>['status' => 1 ],$message2->id =>['status' => 1 ] ]); 
+1

Спасибо за ваш вход @Mohamed. Sync не сделал трюк для меня. –

+0

@FokwaBest чувак, основанный на вашем комментарии выше, вы хотите иметь отношения только от многих до многих, поэтому вы должны вводить в заблуждение свои красноречивые отношения, если хотите, я могу обновить свой ответ и написать правильные отношения, и после этого 'sync()' будет work :) –

+0

чувак, когда пользователь создает сообщение, хранится в таблице сообщений. В сводной таблице просто хранятся записи message_id и получателя ($ user_id). Сейчас он работает очень хорошо, но я хотел бы видеть ваш подход в любом случае. –

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