【问题标题】:Copying one row's data to another row with Laravel's Eloquent (or Fluent)使用 Laravel 的 Eloquent(或 Fluent)将一行的数据复制到另一行
【发布时间】:2014-09-22 12:22:02
【问题描述】:

这是交易。我已经使用两个或多或少的表设置了我的数据库,如下所示(实际上,我的表要复杂得多,但这是要点):

TABLE`元素`

  • 身份证
  • 数据

TABLE `element_drafts`

  • 身份证
  • element_id
  • 数据

您可能可以从名称中猜到,第二个表包含的行是第一个表中行的草稿。 (不要担心推荐更好的方法来做草稿=)我的表格比显示的更复杂,拥有草稿表格是最好的解决方案。

我已经在两个表之间建立了关系,以便可以执行以下操作:

// Get all of the elements along with their draft rows
$elements_with_drafts = Element::with('drafts')->all();

我还可以通过这样做只选择具有草稿行的元素:

$elements_with_drafts = Element::with('drafts')
    ->whereIn('id', function($query)
    {
        $query->select('element_id')->from('element_drafts');
    })
    ->get();

但我想做的一件事我想不通:将草稿值复制到其父元素。

最后,我的目标是通过单个查询将所有 element_drafts['data'] 值复制到其父 element['data'] 字段。

我不完全确定这是否可能。是吗?

我的猜测是,它可能会以某种方式完成:

$elements_with_drafts = Element::with('drafts')
    ->whereIn('id', function($query)
    {
        $query->select('element_id')->from('element_drafts');
    })
    ->update(array("data" => function($query)
    {
        // Somehow select the draft value?
    });

我觉得我真的很接近,但我不太确定如何做我想做的事。有什么想法吗?

注意:显然,这可以通过 foreach 循环相对轻松地完成,但我希望有一个只是单个查询的解决方案。

【问题讨论】:

    标签: laravel laravel-4 eloquent fluent


    【解决方案1】:
    DB::statement('UPDATE elements e
                   JOIN drafts d
                   SET e.data = d.data WHERE e.id = d.element_id');
    

    编辑:查看 deczo 对查询生成器解决方案的回答。

    【讨论】:

    • 好吧,愚蠢的问题(无论如何我不是数据库专家),在这个陈述中,你基本上是在动态创建一个名为“e”的变量,它指向元素表(以及草稿和 d) 一样吗?我没有意识到您可以在 SQL 语句中动态创建变量。甜!
    • 嗯,我收到一条错误消息,上面写着“SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;”有什么想法吗?
    • 是的,我犯了语法错误,已修复。
    【解决方案2】:

    和@Ben 一样,只是他犯了一些错误:

    DB::statement('UPDATE elements e
        JOIN element_drafts d ON e.id = d.element_id
        SET e.data = d.data');
    

    其实你也可以使用Query Builder

    DB::table('elements as e')
        ->join('element_drafts as d', 'd.element_id', '=', 'e.id')
        ->update(['e.data' => DB::raw('d.data')]);
    

    两者都一样。

    请注意,它会将连接的第一行的e.data 设置为d.data(以防每个元素的草稿多于一个)。

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2012-12-04
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多