2015-08-14 104 views
1

我有一个Web应用程序,它目前使用PHP对存储在MySQL数据库中的一些数据进行排序。我目前通过使用Laravel框架来增强应用程序,但是在将Laravel中的所有各种MySQL命令与DB使用的命令等同起来时遇到困难。将MySQL查询翻译成Laravel

我有一个表有一些重复的author名称,并且想要为这些重复项求和citations列值。举例来说,我可能在表格中有两位作者,分别是John Doe,一位是30引用,另一位是20。在运行当前查询后,我将有两行John Doe,两个都与50引用。然后,我使用GROUP BY仅获取作者的一个实例。下面是从我的PHP代码当前查询:

// sum citations for duplicate authors 
mysqli_query($connect, "UPDATE searchresponse AS r JOIN(SELECT author, SUM(citations) AS citations, COUNT(author) AS n FROM searchresponse GROUP BY author) AS grp ON grp.author = r.author SET r.citations = grp.citations"); 

现在,我一直在试图沿着以下线的东西,但我不知道如何复制像Laravel ASSET命令:

// select relevant data 
$sumData = DB::table('searchresponse') 
    -> (something); 
// insert selected data into table 
foreach ($sumData as $value) { 
    DB::table('searchresponse')->insert(
     [ 
      'author' => $value->author, 
      'citations => $value->citations 
     ] 
    ); 
} 

基本上我需要知道如何在Laravel中引用表格AS,所以我可以将它与自身进行比较,就像我在原始方法中引用searchresponse AS r一样。或者,实际上,只是如何在Laravel中复制我的原始PHP MySQL查询。

编辑

它的工作,这似乎更喜欢那种事情,我需要做的:

// sum citations for duplicate authors 
function sumCites($data) { 
    $sumAll = DB::table('searchresponse') 
     ->join('searchresponse', 'searchresponse.citations', '=', 'searchresponse.citations') 
     ->where('searchresponse.author', '=', 'searchresponse.author') 
     ->get(); 
} 

但我仍然得到一个错误

回答

1

请尝试以下方式获得数据:

function sumCites($data){ 
    // Update first 
    \DB::update('UPDATE searchresponse AS r 
    JOIN(
     SELECT author, SUM(citations) AS citations, COUNT(author) AS n FROM searchresponse GROUP BY author 
     ) grp 
     ON grp.author = r.author 
     SET r.citations = grp.citations'); 

    //Now fetch all data from that table 
    $sumAll = \DB::table('searchresponse')->get(); 
    return $sumAll; 
} 

如果你想更新表,你可以使用你的SQL一样,直接

+0

谢谢,但这不起作用。运行该功能后,表中的数据保持不变。 – jayrdi

+0

我是否需要在那里更新'update'来更新表中的数据,或者'join'是否需要处理? – jayrdi

+1

请再试一次。我更新了功能。如果你有任何错误,请告诉我。 – Janaki

1

要加入到因此您需要使用表别名进行连接,请尝试如下所示:

// sum citations for duplicate authors 
function sumCites($data) { 
    $sumAll = DB::update('searchresponse') 
     ->join('searchresponse as b', 'searchresponse.citations', '=', 'b.citations') 
     ->where('searchresponse.author', '=', 'b.author') 
     ->get(); 
} 
+0

谢谢,但这并没有出于某种原因。表中的数据不会改变... – jayrdi

+0

我不需要在那里更新'update'来更新表中的数据吗? – jayrdi

+0

原始查询似乎选择了数据,如果您更新,您必须更新某些列。让我知道你想做什么,我会更新查询。 – yangqi