我有以下查询:
$query = UserSubject::where('user_id', Auth::id())->select('subject_id')->get();
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我得到以下结果:
[{"user_id":8,"subject_id":9},{"user_id":8,"subject_id":2}]
Run Code Online (Sandbox Code Playgroud)
有没有办法将上面的结果复制到另一个表中,以便我的表看起来像这样?
ID|user_id|subject_id
1 |8 |9
2 |8 |2
Run Code Online (Sandbox Code Playgroud)
我$query遇到的问题是可以预期任意数量的行,因此我不确定如何遍历未知数量的行.
我正在尝试编写一个laravel函数,它从一个数据库中获取大量记录(100,000+)并将其放入另一个数据库中.为此,我需要查询我的数据库,看看用户是否已经存在.我反复调用这段代码:
$users = User::where('id', '=', 2)->first();
Run Code Online (Sandbox Code Playgroud)
然后在那之后发生几百次,我的内存耗尽.所以,我做了一个极简主义的例子,它耗尽了所有可用的内存,它看起来像这样:
<?php
use Illuminate\Console\Command;
class memoryleak extends Command
{
protected $name = 'command:memoryleak';
protected $description = 'Demonstrates memory leak.';
public function fire()
{
ini_set("memory_limit","12M");
for ($i = 0; $i < 100000; $i++)
{
var_dump(memory_get_usage());
$this->external_function();
}
}
function external_function()
{
// Next line causes memory leak - comment out to compare to normal behavior
$users = User::where('id', '=', 2)->first();
unset($users);
// User goes out of scope at the end of this function
}
} …Run Code Online (Sandbox Code Playgroud) $cardQueryList = [];
foreach($cards as $cardName => $quantity) {
$cardQueryList[] = [
'username' => $user->username,
'card_uid' => $card->uid,
'have_quantity' => $quantity
];
}
Collection::insert($cardQueryList);
Run Code Online (Sandbox Code Playgroud)
即使行存在,上面的代码也会创建新行.如果行存在,我该怎么做才会更新.如果没有它会创建行?一个雄辩或流利的答案将是最佳的,但如果没有别的办法,我会对原始开放.
我想用单个查询进行批量更新/插入.不是每个记录的for循环查询.理想情况下,出于显而易见的原因,我想打一次数据库.
我也已经检查了以下链接:
如果不存在则插入新记录,如果存在则更新,laravel eloquent
以上工作适用于单个记录更新/插入.如果我使用for循环运行会非常慢.我正在寻找一个允许在单个查询中进行批量插入/更新的答案.
注意:我正在使用'username'和'card_uid'作为我的密钥.所以基本上当我找到一个带有所述用户名和card_uid的行时,我想更新相应的行.否则创建一个新行.
我正试图通过保存多个记录
AppSettings::create(
[
'name'=>'mail_host',
'type'=>$emailsettingstype->id,
'value'=>'',
],
[
'name'=>'mail_port',
'type'=>$emailsettingstype->id,
'value'=>'',
],
[
'name'=>'mail_username',
'type'=>$emailsettingstype->id,
'value'=>'',
],
);
Run Code Online (Sandbox Code Playgroud)
但是从上面开始,只创建了第一个数组.我哪里错了?任何帮助表示赞赏.
我将数据逐个插入行,但我听说过,如果要插入许多数据,需要很多时间.那么一次插入它们的方法是什么?
public function add(Request $request)
{
if ($request->ajax()) {
$books = $request->books;
foreach ($books as $book) {
if (!empty($book)) {
$add = new Book;
$add->name = $book;
$add->user_id = Auth::user()->id;
$add->save();
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个 curl 脚本,它从远程源读取数据。以下是当前代码:
function download_page($path){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$path);
curl_setopt($ch, CURLOPT_FAILONERROR,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$retValue = curl_exec($ch);
curl_close($ch);
return $retValue;
}
$sXML = download_page('http://remotepage.php&function=getItems&count=100&page=1');
$oXML = new SimpleXMLElement($sXML);
foreach($oXML->results->item->item as $oEntry){
$insert_query = mysql_query("INSERT INTO tbl_item (first_name, last_name, date_added) VALUES ('" . $oEntry->firstname . "', '" . $oEntry->lastname . "', '" . date("Y-m-d H:i:s") . "')");
}
Run Code Online (Sandbox Code Playgroud)
然而,正如我想象的那样,该脚本的插入速度非常慢,因为它编写了每个单独的记录。count 变量是为每个页面返回的记录数,而 page 变量是一个简单的页面计数器。
我想知道是否有办法执行批量插入语句来一次插入所有 100 条记录。
提前致谢。
我正在编写一个工匠控制台命令,它循环遍历表中的所有记录并重新生成该表上的字段.
该字段是a hash并且生成为md5()特定字符串的一个.
最初我的代码看起来像这样:
// Get all recipes
$recipes = Recipe::all();
$hashProgress = $this->output->createProgressBar(count($recipes));
// Loop over each recipe and generate a new hash for it
foreach ($recipes as $recipe)
{
$hashString = '';
$hashString .= $recipe->field1;
$hashString .= $recipe->field2;
$hashString .= $recipe->field3;
$hashString .= $recipe->field4;
$hashString .= $recipe->field5;
$hashString .= $recipe->field6;
$hashString .= $recipe->field7;
$extras1Total = $recipe->extras1->sum('amount');
$hashString .= $recipe->extras1->reduce(function ($str, $item) use ($extras1Total) {
return $str . $item->name . ($extras1Total == 0 ? $item->amount : …Run Code Online (Sandbox Code Playgroud) 我制定了一种复制分支用户权限的方法。权限通常为 0 到 120 项。运行此方法将此(0 到 120)项插入到 7 个 user_ids 需要 35-55 秒才能插入到表中。
/**
* Copy Branch User Permissions
*
* @param Int
* @param Int
* @param Int
* @return Array
*/
public function copyBranchUserPermissions($branchIdFrom, $branchIdTo, $userId)
{
$permissions = BranchPermissionUser::get()
->where('branch_id', $branchIdFrom)
->where('user_id', $userId);
foreach($permissions as $permission) {
$permission->create([
'branch_id' => $branchIdTo,
'permission_id' => $permission->permission_id,
'user_id' => $userId
]);
}
return $permissions;
}
Run Code Online (Sandbox Code Playgroud)
由于插入数据的性能缓慢,我需要优化这个过程。我在想如果超过 10 个用户怎么办,所以这个过程会花太长时间。有什么办法可以提高插入数据的性能速度吗?
先感谢您!