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

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

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



답변

에서 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의 답변을 참조하십시오.


답변

실제로 Laravel 4에는 Illuminate / Database / Schema / Builder.php 에 테이블 이름 바꾸기 기능이 있으며 현재 문서화되지 않았습니다 Schema::rename($from, $to);..


답변

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

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

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


답변

이 작업을 수행하는 가장 좋은 방법은 지금까지 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);

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


답변

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를 참조 하십시오 .


답변

이것은 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에서 테스트 됨


답변

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