2015-05-22 2 views
4

Я задаю этот вопрос, чтобы найти наилучшую практику для этого.Если есть Update else Insert Into. MySQL - PHP

DB::table('owners') 
    ->where('property_id',$id) 
    ->update(array('person_id'=>$owner)); 

Проблема заключается в том, что в таблице owners не может иметь строку, чтобы обновить. В этом случае мне нужно сделать INSERT INTO вместо UPDATE.

Моя проблема в том, что я должен каждый раз запускать 2 запроса, один для проверки, существует ли строка, и еще одна - update или insert into. Правильно ли каждый раз запускать 2 запроса? Есть ли лучший способ достичь этого? Мне нужно поддерживать быстрые процессы для пользователя.

ОБНОВЛЕНИЕ: Таблица owners является средней таблицей отношений многих. К сожалению, я не могу использовать ON DUPLICATE KEY.

+4

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html – jarlh

+0

@jarlh Спасибо за Ваш ответ. Я обновил сообщение. – Makis

+0

Не могли бы вы создать сложный уникальный ключ из иностранных идентификаторов в таблице и * затем использовать * при повторном обновлении ключа? – CD001

ответ

3

ну, вы можете попробовать использовать метод Laravel firstOrCreate, чтобы проверить, существует ли пользователь. После этого загрузите объект пользователя и передайте его функции обновления еще, если пользователь не найден. Метод firstOrCreate позаботится о вас, так как он создаст нового пользователя с данными, которые вы предоставите, и автоматически увеличит последний пользователь + 1 идентификатор.

Существует также возможность использовать firstOrNew, который проверяет, существует ли экземпляр на основе значений массива, которые вы передали, и если совпадение не найдено, оно автоматически создаст новый экземпляр модели, которую вы обрабатываете для дальнейших манипуляций.

Вот пример с firstOrNew

файла Пример контроллера.

public function getFirstUserOrNew($email) 
    { 

     $user = User::firstOrNew(['email' => $email]); 

     if($user) 
     { 
     $this->UpdateUser($user); 
     } 
     else 
     { 
     $this->CreateUser($user); 
     } 
    } 

    public function UpdateUser(User $user) 
    { 
     //Do update stuff 
    } 

    public function CreateUser(User $user) 
    { 
     //Do create stuff 
    } 

PS - Я из Греции, если вы хотите обсудить что-нибудь на родном языке, пришлите мне в личку :)

EDIT: Благодаря @Pyton вкладу Кажется, вы также можете использовать a updateOrCreate метод, как поясняется here.

+0

Очень красивый подход! (Спасибо! - Ευχαριστώ πολύ!) – Makis

+1

Нет проблем, вы всегда можете использовать [мутаторы и аксессоры] (http://laravel.com/docs/5.0/eloquent#accessors-and-mutators), чтобы уменьшить дублирование кода или даже создать [репозиторий] (http://bosnadev.com/2015/03/07/using-repository-pattern-in-laravel-5/) для ваших моделей. Τίποτα φίλος;) –

0

Если вы хотите обновить или вставить строку Вы можете использовать updateOrCreate

$owner = Owner::updateOrCreate(['property_id' => $id], ['person_id'=>$owner]); 
+0

Это реальный метод? Я не видел этого в документации. Можете ли вы указать мне ссылку? –

+1

Документация L5 плохая. В выпуске Taylor on L5.1 будут обновлены документы. http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Model.html#method_updateOrCreate Исследуйте Красноречивый/модель и Builder найти интересные методы :) – Pyton

+0

Спасибо спариваться! Также будет проверять API с этого момента .... –

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