从成功的先前函数中调用函数

时间:2019-02-11 18:32:37

标签: php sql laravel

我正在尝试根据laravel文件中第一个存储过程的成功和输出来正确执行第二个存储过程。

我当前正在成功执行此操作(插入记录,并在$ out2中返回记录ID,这是我想要的)

function firstRecord($firstName, $lastName, $email, $customer, $code, $auth)
{
    $stmt = \DB::connection()->getPdo()->prepare('CALL SCHEMA.INSERTRECORD(?,?,null,null,null,null,null,null,?,?,?,?)');

    $stmt->bindParam(1, $firstName, PDO::PARAM_STR);
    $stmt->bindParam(2, $lastName, PDO::PARAM_STR);
    $stmt->bindParam(3, $email, PDO::PARAM_STR);
    $stmt->bindParam(4, $customer, PDO::PARAM_STR);
    $stmt->bindParam(5, $code, PDO::PARAM_STR);
    $stmt->bindParam(6, $out2, PDO::PARAM_STR, 20);

    $stmt->execute();
}

现在执行该操作时,我需要将某些值(auth,out2和email)发送到另一个执行另一过程的函数中,并且所有4个参数都必须为字符串:

function secondRecord($out2, $email, $auth)
{
    $type = 'web';

    $userStmt = \DB::connection()->getPdo()->prepare('call SCHEMA.INSERTRECORDTWO(?,?,?,?)');

    $userStmt->bindParam(1, $out2, PDO::PARAM_STR);
    $userStmt->bindParam(2, $email, PDO::PARAM_STR);
    $userStmt->bindParam(3, $auth, PDO::PARAM_STR, 2500);
    $userStmt->bindParam(4, $type, PDO::PARAM_STR, 20);

    $userStmt->execute();
}

在第一个过程/函数成功后,如何使用这些值正确调用第二个函数?

1 个答案:

答案 0 :(得分:1)

考虑到调用存储函数的特定要求,可以使用以下代码段:

请注意,我使用的是更易于维护的命名绑定。另外,如果您的存储过程正在返回(选择)某项内容,则可以使用DB::select()将其作为输出。

我故意捕获QueryException,因为如果您的数据库没有调用程序或传递了无效的参数,则可以在那里处理这些参数

public function firstRecord($firstName, $lastName, $email, $customer, $code, $auth)
{
    try{

        $insertion = \DB::select( \DB::raw('CALL SCHEMA.INSERTRECORONE(:firstname, :lastname, null, null, null, null, null, null, :email, :customer, :code, :out2)', [

            'firstName' => $firstName,
            'lastName' => $lastName,
            'email' => $email,
            'customer' => $customer,
            'code' => $code,
            'out2' => $out2
        ]));

        $this->secondRecord($out2, $email, $auth, $insertion)
        return $insertion;
    }
    catch(QueryException $e){
        throw new \Exception('Unable to insert records : ' . $e->getMessage());
    }
}

private function secondRecord($out2, $email, $auth, $insertion)
{
    try{

        $insertion = \DB::select( \DB::raw('CALL SCHEMA.INSERTRECORDTWO(:out2, :email, :auth, :type)', [

            'email' => $email,
            'auth' => $auth,
            'out2' => $out2,
            'type' = 'web'
        ]));

        return $insertion;
    }
    catch(QueryException $e){

        throw new \Exception('Unable to insert records in second function : ' . $e->getMessage());
    }
}

但是,我要说的是laravel非常适合使用雄辩的模型来完成这些事情,除非您有非常具体的理由来减少MySQL中的语句解析时间并使用存储的函数/过程调用。