使用Laravel查询构建器和LEFT JOIN删除行

时间:2014-05-22 09:21:17

标签: php mysql laravel-4 left-join sql-delete

如何在一个查询中删除多个表中的行(使用左连接)。 查询:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` ....

所以,我试试这样:

DB::table('deadline', 'job')
    ->leftJoin('job', 'deadline.id', '=', 'job.deadline_id')
    ->where('deadline.id', $id)
    ->delete();

似乎Laravel不支持使用左连接从多个表中删除。

是否有受支持的方式或解决方法?

4 个答案:

答案 0 :(得分:5)

似乎我的方式是不可能的。所以,我这样做了。

$q = 'DELETE deadline, job FROM deadline LEFT JOIN job ...where deadline.id = ?';        
$status = \DB::delete($q, array($id));

文档:http://laravel.com/docs/database#running-queries

答案 1 :(得分:1)

要使laravel允许连接删除很简单 - 您只需将Illuminate\Database\Query\Grammars\Grammar中的compileDelete函数更改为:

public function compileDelete(Builder $query)
{
    $table = $this->wrapTable($query->from);

    $components = implode(' ', array(
        is_array($query->joins) ? $this->compileJoins($query, $query->joins) : '',
        is_array($query->wheres) ? $this->compileWheres($query, $query->wheres) : '',
        is_array($query->limit) ? $this->compilelimit($query, $query->limit) : '',
        is_array($query->offset) ? $this->compileOffset($query, $query->offset) : ''
    ));

    return trim("delete $table from $table ".$components);
}

然后 - > delete()将以您期望的方式工作。我已经将这个作为拉取请求添加到laravel框架repo中,所以希望这可能会合并到下一个版本中 - 只需看看。

答案 2 :(得分:0)

DB::table(DB::raw('deadline, job'))可能有用。如果没有,则必须手动编写SQL并通过DB::statement()调用它。

答案 3 :(得分:0)

$query = 'DELETE courses,course_contents FROM courses 
          INNER JOIN course_contents ON course_contents.course_id = courses.id  
          WHERE courses.id = ?';

\DB::delete($query, array($id));