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

时间:2014-06-06 11:10:11

标签: php mysql stored-procedures laravel-4

我在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]:找不到基表或视图。

请帮帮我。 感谢。

3 个答案:

答案 0 :(得分:1)

我得到了解决方案:

这是我在控制器中所做的:

 $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));
    }
}

答案 1 :(得分:1)

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

虽然在命令行上很好,但我觉得在mySQL中的存储过程中使用“set = @variable”是有风险的。跨范围边界没有范围和变量。这与声明没有“var”前缀的JavaScript中的变量类似,后者是全局命名空间并创建意外的冲突和覆盖。

我希望mySQL的优秀人员能够在存储过程中的各个块级别允许DECLARE @Variable。注意@(在标志处)。 @符号前缀有助于将变量名称与表列名分开 - 因为它们通常是相同的。当然,总是可以添加“v”或“l_”前缀,但是@符号是一种方便而简洁的方法,可以使变量名称与您可能从中提取数据的列匹配而不会破坏它。

MySQL是存储过程的新手,他们在第一个版本上做得很好。很高兴看到他们在这里采用它的形式,并观察语言服务器方面的成熟。

答案 2 :(得分:0)

  

不,表名是用户,InsertUsers是程序的名称。

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

class Insertuser extends Eloquent {

   protected $table = 'users';