2016-12-08 7 views
5

Używam laravel i trzeba uruchomić surowego kwerendy SQL z modelu/Repository klasyRunning surowego SQL wewnątrz Model: laravel

INSERT INTO calendar 
(room_id, date, default_count, default_price) 
VALUES ('1', '2017-01-02', '2', '400004') 
ON DUPLICATE KEY UPDATE 
default_count = VALUES(default_count), default_price = VALUES(default_price); 

ex. Kiedy wstawić dane z UserRepository

$this->users->insert(['email' => '[email protected]', 'votes' => 0]); 

muszę jakieś metody, aby uzyskać połączenie DB i uruchomić SQL za pomocą modelu

//Something like 
$this->users->execute($sql); 

Widziałem laravel ma updateOrInsert() metody, ale muszę uruchomić to dla wielu danych zestawy naraz.

Jak uruchomić surowe zapytanie sql za pośrednictwem klasy modelu lub repozytorium?

Dzięki

aktualizowana - ROZWIĄZANIA

przeszedłem Eloquent Model Sourcecode i znalazł mogę połączenie z getConnection metoda()

$this->users->getConnection()->statement($sql); 
+0

Proszę wyjaśnić konkretny problem lub dodać dodatkowe informacje, aby dokładnie zaznaczyć, czego potrzebujesz. Jak jest napisane, trudno powiedzieć dokładnie, o co prosisz. –

+1

@ZakariaAcharki Zaktualizowano –

+0

Nie potrzebujesz ** tego. To, czego potrzebujesz, to złapać wyjątek i sprawdzić, czy jego kod zawiera '23000', który jest kodem dla zduplikowanego wpisania klucza. W tym momencie możesz po prostu przystąpić do aktualizacji swojego modelu.W modelu można utworzyć pojedynczą metodę, która zajmuje się wstawianiem/wychwytywaniem wyjątku/sprawdzaniem, czy kod ma wartość 23000, a następnie aktualizuje model. Możesz uniknąć pobierania połączenia, czynienia transakcji i wszystkich innych nieprzyjemnych rzeczy, które chcesz zrobić. – Mjh

Odpowiedz

0

poszedłem poprzez wymowny modelu źródłowego i znalezionego mogę uzyskać połączenia z getConnection metoda()

$this->users->getConnection()->statement($sql); 

nie wiem Instrukcja statement() to najlepszy sposób na uruchomienie tego sql. Jednak zadziałało.

Dziękuję wszystkim za pomoc. Także, jeśli masz lepsze rozwiązanie, proszę dać mi znać

0

Czy podoba Ci się ta

$query = array(['room_id' => 1, 'date' => '2/1/2017', 'default_count' => '2', 'default_price' => '400004'], 
['room_id' => 2, 'date' => '2/1/2017', 'default_count' => '3', 'default_price' => '455004']); 


DB::table('calendar')->insart('query'); 

I al więc można zrobić tak, Załóż obj Twojego modalnym i przypisać wartości

$obj_calendar = new Calendar(); 
$obj_calendar->room_id = 1; 
$obj_calendar->date = date('Y-m-d H:i:s', strtotime('2017-01-02')); 
$obj_calendar->default_count = 2; 
$obj_calendar->default_price = 400004; 
$obj_calendar->save(); 

Korzystanie transakcję

// rozpocząć transakcję

public function beginTransaction() 
{ 
    DB::beginTransaction(); 
} 

// dokonać transakcję

public function makeTransaction($query) 
{ 
    DB::transaction(function($query) use($query) 
    { 
    DB::insert($query); 
    }); 
} 

// popełnić transakcja

public function commitTransaction() 
{ 
    return DB::commit(); 
} 

W swojej metodzie

public function insert($data) 
{ 
    $this->beginTransaction(); 

    for($i=0; $i<count($data); $i++) 
    { 
    $name = $data[$i]->first_name, "middle_name" => $data[$i]->middle_name, "last_name" => $data[$i]->last_name; 

    $query = "INSERT INTO tbl_name(id, first_name, description, created_at, updated_at) VALUES (" . $data[$i]->id . ", " . $name . ", '" . $data[$i]->description . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "'); "; 

    $scraper_service->makeTransaction($query); 
    } 

    //Add last commit 
    $this->commitTransaction(); 
} 
+0

Niestety muszę uruchomić wiersz SQL, a nie wolą załadować inną klasę, aby uzyskać połączenie wewnątrz modelu –

+0

Następnie za pomocą transakcji – Komal

+0

trzeba uruchomić https://github.com/laravel/framework/blob/43637b796f1ac0b1a960984231251ff04b438006/src/Illuminate/ Baza danych/Eloquent/Model.php # L605-L612 ale dla wielu zestaw danych. W tym przypadku lepiej jest uruchomić jedno zapytanie zamiast 10 zapytań dla tego samego zadania –

Powiązane problemy