Laravel 4: як запустити необроблений SQL?


79

Я хочу перейменувати таблицю в Laravel 4, але не знаю, як це зробити.

SQL є alter table photos rename to images. Якщо є красномовне рішення, я також хотів би знати, як запустити необроблений 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();

Подальше оновлення Якщо ви спеціально прагнете перейменувати таблицю - для цього існує команда схеми - див. Відповідь Майка нижче.


4
Існує фактична функція Schema :: rename ($ from, $ to), яку називає Майк Бренскі. Використовуйте це, і воно буде працювати незалежно від бази даних.
trm42

Чому це прийнята відповідь, коли вона не використовує належний метод L4 Schema::rename($from, $to), як я вже згадував @ trm42 та @Mike Branski? Будь ласка, подумайте про його зміну, щоб надати іншим глядачам актуальну відповідь.
Шон Бін

1
Оскільки назва - "як запустити необроблений SQL?" але питання включає приклад перейменування таблиці. Питання також говорить I'd also like to know how to run a raw SQL- так що моя відповідь на цю частину. Ви праві, що Schema::rename()функція корисна для конкретного випадку перейменування таблиці.
Лоуренс

Це правда, але моє запитання було спрямоване на ОП, @duality_. (До речі, причиною, з якої я б сумнівався, чи має це бути прийнята відповідь, є те, що вона не надає глядачам стандартних тепер методів для запуску необроблених запитів, як це задокументовано на laravel.com/docs/4.2/database#running-queries Насправді ваше твердження про те, що "Є також кілька команд для зміни схеми - але перейменування таблиці не є однією з них", не відповідає дійсності з ~ лютого 2013 року. Якщо ви хочете, щоб це залишилося прийнятою відповіддю, я пропоную вам оновіть його, щоб він був кориснішим для майбутніх глядачів.)
Шон Бін


15

Ви також можете використовувати DB::unpreparedдля ALTER TABLEзапитів.

DB::unpreparedпризначений для використання для таких запитів, як CREATE TRIGGER. Але по суті він безпосередньо виконує необроблені запити sql. (без використання preparedоператорів PDO )

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


Це працює для мене, коли я хочу використовувати DB::query("SET foreign_key_checks=0");
swdev

1
@swdev: PDO підтримує SET запити . Однак за допомогою DB::query( PDO::query) він без потреби створить підготовлений оператор, оскільки вищезазначений запит не має змінної.
smitrp

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, і мені потрібно було це зробити.
Aditya MP

1
Дякую за Вашу відповідь. Ми знаходимо найпростіший спосіб виконати необроблений запит створення таблиці
sujivasagam

1
Залежно від того, що таке $ this-> id, він може бути вразливим до введення sql.
Північний полюс

Наявність можливості виконувати кілька команд SQL в одному рядку надзвичайно небезпечно, якщо ви вводите будь-який вхід користувача в будь-який із запитів. Це слід зазначити у відповіді. (Див. Php.net/manual/en/function.pg-escape-string.php або php.net/manual/en/mysqli.real-escape-string.php щодо того, як запобігти цьому.) Крім того, це лише відповіді половина запитання OP (як запустити необроблений SQL-запит, а не як перейменувати таблицю в Laravel 4) або вказати, що існує офіційне рішення (див. laravel.com/docs/4.2/schema#creating-and-dropping- таблиці ). Проголосування проти.
Шон Бін

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');

Примітка: клас DB Laravel також підтримує запуск сирої 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 raw sql - Вставити запит:

дозволяє створити посилання get, щоб вставити дані, доступні через url. тому наше ім’я посилання - „insertintodb“, і всередині цієї функції ми використовуємо клас db. db клас допомагає нам взаємодіяти з базою даних. ми використовуємо статичну функцію класу db. Усередині функції вставки ми напишемо наш запит PDO для вставки даних у базу даних. у нижченаведеному запиті ми вставимо "мій заголовок" та "мій вміст" як дані у таблицю повідомлень.

помістіть нижче код у файл web.php всередині каталогу маршрутів:

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

Тепер запустіть зверху вставте запит за посиланням браузера нижче:

localhost/yourprojectname/insertintodb

Ви можете переглянути вихідний запит на вставку, перейшовши до таблиці бази даних. Ви знайдете запис з ідентифікатором 1.

Laravel raw sql - Прочитайте запит:

Тепер давайте створимо посилання get для читання даних, яке можна отримати за допомогою url. тому наше ім’я посилання - „readfromdb“. ми використовуємо статичну функцію класу db read. Усередині функції читання ми напишемо наш запит PDO для зчитування даних з бази даних. у нижченаведеному запиті ми будемо читати дані ідентифікатора '1' з таблиці повідомлень.

помістіть нижче код у файл web.php всередині каталогу маршрутів:

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

тепер запускаємо зверху запит на читання за посиланням браузера нижче:

localhost/yourprojectname/readfromdb

Доброго дня, який другий параметр у БД :: select (... Я не можу знайти його в документації. Будь ласка, допоможіть.
Євген Афанасьєв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.