Laravel 4 : 원시 SQL을 실행하는 방법?


79

Laravel 4에서 테이블의 이름을 바꾸고 싶지만 그 방법을 모르겠습니다.

SQL은 alter table photos rename to images입니다. Eloquent 솔루션이 있다면, 원시 SQL을 실행하는 방법도 알고 싶습니다. 때로는 대안이 없기 때문입니다.

답변:


147

에서 Laravel 4 매뉴얼 - 그것은이 같은 원시 명령을 수행에 대해 이야기 :

DB::select(DB::raw('RENAME TABLE photos TO images'));

편집 : 나는 Laravel 4 문서 에서 이것을 발견했습니다 .

DB::statement('drop table users');

업데이트 : Laravel 4.1 (아마도 4.0-잘 모르겠습니다)-원시 Where 쿼리에 대해서도 다음과 같이 할 수 있습니다.

$users = User::whereRaw('age > ? and votes = 100', array(25))->get();

추가 업데이트 특별히 테이블 이름 변경을 수행하려는 경우-스키마 명령이 있습니다-아래 Mike의 답변을 참조하십시오.


4
Mike Branski가 아래에 언급 한 실제 Schema :: rename ($ from, $ to) 함수가 있습니다. 그것을 사용하면 데이터베이스에 관계없이 작동합니다.
trm42 2014

Schema::rename($from, $to)@ trm42 및 @Mike Branski가 언급했듯이 적절한 L4 방법을 사용하지 않는데 왜 이것이 허용되는 대답 입니까? 다른 시청자에게 최신 답변을 제공하도록 변경해보세요.
Sean the Bean

1
제목이 "원시 SQL을 실행하는 방법"이기 때문입니다. 그러나 질문에는 테이블 이름 변경에 대한 예가 포함되어 있습니다. 질문은 또한 말합니다 I'd also like to know how to run a raw SQL-내 대답은 그 부분에 대한 것입니다. 이 Schema::rename()함수가 테이블 이름 변경의 특정 경우에 유용 하다는 것이 맞습니다 .
로렌스

그 정도는 사실이지만 내 질문은 OP, @duality_에 대한 것이 었습니다. (BTW, 이것이 받아 들인 대답이어야하는지 질문하는 이유는 laravel.com/docs/4.2/database#running-queries에 문서화 된 것처럼 원시 쿼리를 실행하는 현재 표준 방법을 뷰어에게 제공하지 않기 때문입니다. . 실제로 "스키마 변경을 수행하는 몇 가지 명령도 있지만 테이블 이름을 바꾸는 것은 그중 하나가 아닙니다."라는 진술은 2013 년 2 월 이후로 사실이 아닙니다. 이것이 허용 된 답변으로 유지되기를 원한다면, 나는 당신에게 제안합니다 그것이 미래의 시청자들에게 더 유용하게 업데이트).
숀 빈이


15

당신은 또한 사용할 수 있습니다 DB::unprepared에 대한 ALTER TABLE쿼리.

DB::unprepared와 같은 쿼리에 사용됩니다 CREATE TRIGGER. 그러나 본질적으로 원시 SQL 쿼리를 직접 실행합니다. (PDO prepared문 을 사용하지 않음 )

https://github.com/laravel/framework/pull/54


내가 사용하고 싶을 때 작동합니다 DB::query("SET foreign_key_checks=0").
swdev

1
@swdev : PDO는 SET 쿼리를 지원 합니다 . 그러나 DB::query( PDO::query)를 사용하면 위의 쿼리에 변수가 없기 때문에 불필요하게 준비된 문이 생성됩니다.
smitrp 2014 년

10

이 작업을 수행하는 가장 좋은 방법은 지금까지 Laravel의 측면 단계에서 Pdo 개체를 사용하여 직접 쿼리를 실행하는 것으로 나타났습니다.

DB::connection()->getPdo()->exec( $sql );

일반적으로 일회성 쿼리가 데이터베이스 쿼리 도구를 열고 전체 구문 검사로 쿼리를 입력 한 다음 직접 실행하는 것이 더 빠르고 효율적입니다.

이것은 저장 프로 시저로 작업해야하거나 데이터베이스 기능을 사용해야하는 경우 필수적입니다.

예 2 created_at를 필요한 값으로 설정하고 탄소 펑키를 측면 침지

$sql = 'UPDATE my_table SET updated_at = FROM_UNIXTIME(nonce) WHERE id = ' . strval($this->id);
DB::statement($sql);

나는 이것이 컨트롤러에서 작동하지만 마이그레이션에서는 작동하지 않는다는 것을 알았습니다.


마침내 작동하는 솔루션입니다. 내가하고 있었기 때문에 이것을 사용해야했다 DB::connection()->getPdo()->exec('USE '.$dbConfig['database']);. 나는 Laravel 명령에서 DB를 삭제하고 재생성하고 있었으며이를 수행해야했습니다.
Aditya MP

1
응답 해 주셔서 감사합니다. 우리는 원시 테이블 만들기 쿼리를 실행하는 가장 쉬운 방법 찾기
sujivasagam

1
$ this-> id의 위치에 따라 SQL 주입에 취약 할 수 있습니다.
North-Pole

하나의 문자열에서 여러 SQL 명령을 실행할 수있는 기능은 쿼리에 모든 종류의 사용자 입력을 주입하는 경우 매우 위험합니다. 이것은 답변에 기록되어야합니다. ( 이를 방지하는 방법 은 php.net/manual/en/function.pg-escape-string.php 또는 php.net/manual/en/mysqli.real-escape-string.php 를 참조하십시오 .) 추가로, 이것 만 답합니다. OP 질문의 절반 (라 라벨 4에서 테이블 이름을 바꾸는 방법이 아닌 원시 SQL 쿼리를 실행하는 방법) 또는 공식 솔루션이 있음을 나타냅니다 ( laravel.com/docs/4.2/schema#creating-and-dropping- 참조) . 테이블 ). 반대 투표.
Sean the Bean

8

Laravel 4에서 테이블 이름을 변경하는 데 허용되는 방법은 스키마 빌더를 사용하는 것입니다. 따라서 다음을 수행하고 싶을 것입니다.

Schema::rename('photos', 'images');

에서 http://laravel.com/docs/4.2/schema#creating-and-dropping-tables

원시 SQL 쿼리를 직접 작성하려면 언제든지 다음을 수행 할 수 있습니다.

DB::statement('alter table photos rename to images');

참고 : Laravel의 DB 클래스는 원시 SQL 실행 지원 select, insert, update,와 delete같은 쿼리를 :

$users = DB::select('select id, name from users');

자세한 내용은 http://laravel.com/docs/4.2/database#running-queries를 참조 하십시오 .


2

이것은 RAW SELECT를 실행하고 결과를 얻고 값에 액세스하는 방법에 대한 간단한 예입니다.

$res = DB::select('
        select count(id) as c
        from prices p 
        where p.type in (2,3)
    ');
    if ($res[0]->c > 10)
    {
        throw new Exception('WOW');
    }

반환 결과없이 SQL 스크립트 만 실행하려면 이것을 사용하십시오.

DB::statement('ALTER TABLE products MODIFY COLUMN physical tinyint(1) AFTER points;');

laravel 5.1에서 테스트 됨


1

Laravel 원시 SQL – 쿼리 삽입 :

url을 통해 액세스 할 수있는 데이터를 삽입하는 링크를 만들 수 있습니다. 따라서 링크 이름은 'insertintodb'이고 해당 함수 내에서 db class를 사용합니다. db 클래스는 데이터베이스와 상호 작용하는 데 도움이됩니다. 우리는 db 클래스 정적 함수 삽입. 삽입 함수 내에서 우리는 데이터베이스에 데이터를 삽입하는 PDO 쿼리를 작성합니다. 아래 쿼리에서 '내 제목'과 '내 콘텐츠'를 posts 테이블의 데이터로 삽입합니다.

route 디렉토리 내의 web.php 파일에 아래 코드를 넣으십시오.

Route::get('/insertintodb',function(){
DB::insert('insert into posts(title,content) values (?,?)',['my title','my content']);
});

이제 아래 브라우저 링크에서 쿼리 삽입 위를 실행하십시오.

localhost/yourprojectname/insertintodb

데이터베이스 테이블로 이동하여 위의 삽입 쿼리의 출력을 볼 수 있습니다. ID가 1 인 레코드를 찾을 수 있습니다.

Laravel raw sql – 쿼리 읽기 :

이제 url을 통해 액세스 할 수있는 데이터 읽기 링크를 생성 해 보겠습니다. 그래서 우리의 링크 이름은 'readfromdb'입니다. 우리는 db 클래스 정적 함수를 읽었습니다. 읽기 기능 내에서 우리는 데이터베이스에서 데이터를 읽는 PDO 쿼리를 작성합니다. 아래 쿼리에서는 posts 테이블에서 id '1'의 데이터를 읽습니다.

route 디렉토리 내의 web.php 파일에 아래 코드를 넣으십시오.

Route::get('/readfromdb',function() {
    $result =  DB::select('select * from posts where id = ?', [1]);
    var_dump($result);
});

이제 아래의 브라우저 링크에서 읽기 쿼리를 실행하십시오.

localhost/yourprojectname/readfromdb

좋은 하루, DB에서 두 번째 매개 변수가 무엇인지 :: (선택 ... 나는이 문서에서 찾을 수 없습니다 바랍니다 도움이됩니다..
예브게니 Afanasyev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.