如何在laravel中使用模型调用参数化存储过程


How to call a parameterized stored procedure using model in laravel

我在mysql中创建了一个名为'Insertusers'的存储过程,其中有8个参数

现在我想使用我的模型调用这个过程,并使用这个过程在表中插入值。

这是我的模型的代码:

<?php
    class Insertuser extends Eloquent {
        protected $guarded = array();
 public static function storedProcedureCall() {
         return DB::statement('Insertusers');
    } 
 public static $rules = array();
            }
?>

这是我的控制器的代码:

public function createUser() {
$clan = new Insertuser;
            $clan->clanname = Input::get('clanname');
            $clan->description = Input::get('tbx_new_clan_Des');
            if (Input::get('chk_new_clan_Status')) {
                $clan->active = true;
            } else {
                $clan->active = false;
            }
            if (Input::get('chk_new_clan_Incoming')) {
                $clan->allow_incoming = true;
            } else {
                $clan->allow_incoming = false;
            }
            if (Input::get('chk_new_clan_key')) {
                $clan->clan_key = Input::get('tbx_new_clan_key');
            }
            $clan->created_by = Session::get('userid');
            $clan->last_updated_by = Session::get('userid');
            $clan->DOMType=1;
            $clan->save();
}

当我尝试创建一个用户,我得到以下错误:

SQLSTATE[42S02]: Base table or view not found.

请帮帮我。谢谢。

MSSQL要求声明过程中的变量,并且人们使用@Variable语法(DECLARE @TEXT VARCHAR(25) = 'text')。此外,MS允许在过程中的任何块中声明,不像mySQL需要在顶部声明所有的声明。

虽然在命令行上很好,但我觉得在mySQL的存储过程中使用"set = @variable"是有风险的。没有作用域,变量跨越作用域边界。这类似于JavaScript中没有"var"前缀的变量声明,它是全局命名空间,会产生意想不到的冲突和覆盖。

我希望mySQL的好人们将允许在存储过程中的不同块级别上声明@Variable。注意@ (at符号)。@符号前缀有助于将变量名与表列名分开——因为它们通常是相同的。当然,总是可以添加"v"或"l_"前缀,但是@符号是一种方便而简洁的方法,可以使变量名与您可能从中提取数据的列匹配,而不会破坏它。

MySQL是存储过程的新版本,他们在第一个版本中做得很好。很高兴看到他们在这里形成,并看到该语言的服务器端方面成熟。

我得到了解决方案:

这是我在控制器中做的:

 $clan_key;
            $clanname=Input::get('clanname');
            $description=Input::get('tbx_new_clan_Des');
            if (Input::get('chk_new_clan_Incoming')) {
                $allow_incoming = true;
            } else {
               $allow_incoming= false;
            }
             if (Input::get('chk_new_clan_key')) {
               $clan_key = Input::get('tbx_new_clan_key');
            }
            $created_by= Session::get('userid');
            $last_updated_by = Session::get('userid');
                    if (Input::get('chk_new_clan_Status')) {
                $active = true;
            } else {
                $active = false;
            }
            $DOMType=1;
            Clan::storedProcedureCall($clanname, $description, $allow_incoming, $clan_key,$created_by, $last_updated_by, $active, $DOMType);

这是我的模型:

class Clan extends Eloquent {
    protected $table = 'clans';
    public static function storedProcedureCall($clanname,$description,$allow_incoming,$clan_key,$created_by,$last_updated_by,$active,$DOMType) {
         return DB::select('call Insertusers(?,?,?,?,?,?,?,?)',array($clanname,$description,$allow_incoming,$clan_key,$created_by,$last_updated_by,$active,$DOMType));
    }
}

不,表名是users, InsertUsers是Procedure的名字

在你发布的代码中,你没有告诉Laravel。试试这个:

class Insertuser extends Eloquent {
   protected $table = 'users';