Создайте инструкцию Insert... Select в Laravel

Мне нужно преобразовать этот запрос для Laravel, и у меня возникают проблемы с попыткой создать инструкцию Insert... Select, используя Laravel Eloquont ORM или Queries. Я не уверен, как бы я хотел создать этот запрос.

Insert into Demand (Login, Name, ApptTime, Phone, Physician, Location, FormatName, FormatDate, FormatTime, ApptDate, FormatPhone, cellphone)
Select Login, Name, ApptTime, Phone, Physician, Location, FormatName, FormatDate, FormatTime, ApptDate, FormatPhone, cellphone from " . [dbname] . "
    Where " . $where_statement

Как можно создать этот запрос с помощью Laravel ORM?

EDIT: я не уверен, ясно ли это, но я думаю с точки зрения 1 запроса, как они здесь. http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

Ответ 1

Невозможно сделать это в одном запросе (если только вы не используете Laravel 5.7), однако я столкнулся с той же проблемой и хотел убедиться, что я могу продолжать использовать определенный выбор, который я строю с помощью QueryBuilder.

Итак, что вы можете сделать, чтобы сохранить вещи наполовину такими же чистыми и повторно использовать функциональность, которая раньше создавала оператор select, так:

/**
 * Wherever your Select may come from
 **/
$select = User::where(...)
                  ->where(...)
                  ->whereIn(...)
                  ->select(array('email','moneyOwing'));
/**
 * get the binding parameters
 **/ 
$bindings = $select->getBindings();
/**
 * now go down to the "Network Layer"
 * and do a hard coded select, Laravel is a little
 * stupid here
 */
 $insertQuery = 'INSERT into user_debt_collection (email,dinero) '
                . $select->toSql();

 \DB::insert($insertQuery, $bindings);

ОБНОВЛЕНИЕ Laravel 5.7

Начиная с Laravel 5.7.17 вы можете использовать → insertUsing(). Смотрите здесь для деталей. Спасибо @Soulriser за указание на это.

Поэтому приведенный выше запрос будет выглядеть так:

DB::table('user_debt_collection')->insertUsing(['email','dinero'], $select);

Ответ 2

Вы можете использовать:

DB::insert("insert into contacts(contact_id,contact_type,account_id,created_at,updated_at) select f.id,'App\\Friend',f.account_id,f.created_at,f.updated_at from friends as f where f.id=?",[16]);

Ответ 3

В Laravel 5.5 я создал вспомогательную функцию для более простого выполнения:

class QueryHelper
{

    /**
     * @param string $model
     * @param array $columns
     * @param Builder $select
     * @return bool
     */
    public static function insertFromSelectStatement($model, $columns, $select)
    {
        /** @var \Illuminate\Database\Query\Builder $query */
        $query = (new $model)->getQuery();
        $sql = "insert into {$query->from} (". implode(', ', $columns) .") {$select->toSql()}";
        return $query->getConnection()->insert($sql, $select->getBindings());
    }
}

Например:

$notification = Notification::create([
    'title' => 'this is title',
    'message' => 'this is message',
]);
$now = DB::raw("'". Carbon::now()->toDateTimeString() ."'");
$selectActivatedUsers = User::select('id', $notification->id, $now, $now)->where('status', '=', 'activated');
// insert notifications to activated users
QueryHelper::insertFromSelectStatement(UserNotification::class, ['user_id', 'notification_id', 'created_at', 'updated_at'], $selectActivatedUser);

Ответ 4

Сначала вам нужно создать модель для Demand, поэтому вы можете использовать:

$demand = new Demand;
$demand->Login = $login;
$demand->Name = $name;
[...]
$demand->save(); // <~ this is your "insert" statement
$id = $demand->id;

Затем для вашего оператора выбора вы можете сделать что-то похожее на эти параметры:

$demand = Demand::find($id); // will be similar to: SELECT * FROM Demand WHERE `id` = '$id';
$demand = Demand::where('id', $id)->get(); //same as above
$demand = Demand::where('id', $id)->get(array('Login', 'Name')); // will be similar to: SELECT `Login`, `Name` FROM Demand WHERE `id` = '$id';

В руководстве есть намного больше информации здесь и здесь

Ответ 5

Попробуй это

DB::table(table2)
    ->insert(
        (array) DB::table(table1)
            ->where('column', '=', $variable)
            ->select('column1','column2')
            ->first()
    );

Ответ 6

Я использовал DB :: Statement (...);

BD::statement(INSERT INTO table (SELECT));