Dev*_*ray 13 php csv laravel laravel-5
所以我是Laravel的一个完整的菜鸟,我在这里尝试一些东西.我想将CSV文件导入到两个表中,我有一个名为lists的表,它将获取列表名称和a client_id.
然后我有一个名为customers的表,它将获得姓名联系号以及client_ida list_id.
我想要实现的是导入一个CSV文件,该文件将获取文件名并将其存储在列表中,然后通过CSV文件创建一个数组,并将数据导入带有列表和客户端ID的customers表中.
我完成了第一部分,它正确地插入到列表中,我现在如何从存储/文档中的CSV创建一个数组,然后将其插入到customers表中?
namespace App\Http\Controllers;
use Input;
use DB;
use Illuminate\Http\Request;
use App\Http\Requests\ListsRequest;
use App\Lists;
use App\Clients;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class ListsController extends Controller {
public function index()
{
// $list_items = Lists::all();
$clients = Clients::all();
return view('lists.show', compact('clients'));
}
public function store(Requests\ListsRequest $request)
{
$input = $request->input();
Lists::create($input);
if (Input::hasFile('name'))
{
$file = Input::file('name');
$name = time() . '-' . $file->getClientOriginalName();
$path = storage_path('documents');
$file->move($path, $name);
// All works up to here
// All I need now is to create an array
// from the CSV and insert into the customers database
}
}
}
Run Code Online (Sandbox Code Playgroud)
我选择使用我接受的答案,但我也使用了另一个答案并让它像这样工作.
public function store(Requests\ListsRequest $request)
{
$input = $request->input();
$client_id = $request->input('client_id');
if (Input::hasFile('name'))
{
$file = Input::file('name');
$name = time() . '-' . $file->getClientOriginalName();
$path = storage_path('documents');
Lists::create(['client_id' => $client_id, 'name' => $name]);
$reader = Reader::createFromPath($file->getRealPath());
// Create a customer from each row in the CSV file
$headers = array();
foreach ($reader as $index => $row)
{
if ($index === 0)
{
$headers = $row;
} else
{
$data = array_combine($headers, $row);
Customers::create($data);
}
}
$file->move($path, $name);
return view('clients');
}
}
Run Code Online (Sandbox Code Playgroud)
may*_*ʎɐɯ 28
读取CSV文件有三个步骤,并将其导入Laravel的数据库中.
在开始之前,我创建了一个示例test.csv文件并将其放在文件夹下的公共文件夹中:
name,email,password
user1,email1@email.com,pasxxxxxxxxxword
user2,email2@email.com,pasxxxxxxxxxword
user3,email3@email.com,pasxxxxxxxxxword
Run Code Online (Sandbox Code Playgroud)
第1步和第2步; 我创建了一个名为helper的函数csvToArray,我现在把它放在我的控制器中(这个函数的灵感来自这个链接)它只是读取CSV文件并将其转换为数组:
function csvToArray($filename = '', $delimiter = ',')
{
if (!file_exists($filename) || !is_readable($filename))
return false;
$header = null;
$data = array();
if (($handle = fopen($filename, 'r')) !== false)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== false)
{
if (!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}
Run Code Online (Sandbox Code Playgroud)
第3步; 这是我的最后一步,读取数组并将其插入我们的数据库:
public function importCsv()
{
$file = public_path('file/test.csv');
$customerArr = $this->csvToArray($file);
for ($i = 0; $i < count($customerArr); $i ++)
{
User::firstOrCreate($customerArr[$i]);
}
return 'Jobi done or what ever';
}
Run Code Online (Sandbox Code Playgroud)
注意:此解决方案假设您在Laravel项目中有一个模型,并且在数据库中具有正确的表.
在您的store()方法中,在lists表中创建记录,然后遍历 CSV 文件的内容并将数据插入customers表中。为此,您应该在客户和列表之间创建关系。您最好使用类似PHP League 的 CSV 包来读取此类文件:
public function store(AddCustomersRequest $request)
{
// Get uploaded CSV file
$file = $request->file('csv');
// Create list name
$name = time().'-'.$file->getClientOriginalName();
// Create a list record in the database
$list = List::create(['name' => $name]);
// Create a CSV reader instance
$reader = Reader::createFromFileObject($file->openFile());
// Create a customer from each row in the CSV file
foreach ($reader as $index => $row) {
$list->customers()->create($row);
}
// Redirect back to where you need with a success message
}
Run Code Online (Sandbox Code Playgroud)