1

私は現在、ユーザーがExcelファイルを挿入できるモーダルに取り組んでいます。システムのタスクは、新しいデータベース レコードをアップロードおよび/または追加することです。レコードが新しい場合、またはデータベースに存在するレコードと同一の場合です。ただし、スラッグ列が名前列と同一でないレコードを削除するための削除機能も必要です。

現在、私はLaravel 5.3を使用しており、これが現在のコントローラーです。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Product;
use App\Http\Requests;
use Illuminate\Support\Facades\DB;
use Input;
use Maatwebsite\Excel\Facades\Excel;

class ProductsController extends Controller {

public function importExcel(Request $request) {
    if (Input::hasFile('productFile')) {
        $path = Input::file('productFile')->getRealPath();
        $checkbox = Input::get('productCheckbox');
        $data = Excel::load($path, function($reader) {
        })->get();

        if (!empty($data) && $data->count()) {
            foreach ($data as $key => $value) {
                $product = Product::all()->where('slug', $value->slug)->first();
                $product_false = Product::all()->where('slug', '!=' , 'name')->get();

                if ($product_false !== null){
                    //delete row if slug does not matches name
                    dd($product_false);
                }

上記の dd はすべての製品を返すため、コレクション クエリが正しく機能していません (このコレクションで実行しようとしている生の SQL については、以下を参照してください)。

                if ($product !== null) {
                    //update row if exist
                    $product->name = $value->name;
                    $product->description = $value->description;
                    $product->price = $value->price;
                    $product->save();
                } else {
                    //add new row if not exist
                    $product = new Product;
                    $product->slug = $value->slug;
                    $product->name = $value->name;
                    $product->description = $value->description;
                    $product->price = $value->price;
                    $product->save();
                }

            }
            header("Location: /products");
        }
    }
}

}

これは製品モデルです:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'slug', 'name', 'description', 'price',
];
}

これは、基本的にコレクションで使用するために探している PHPMyAdmin 生の SQL (動作します) です。

SELECT * FROM `products` WHERE `slug` != `name`

誰かがこの穴から私を助けてくれることを願っています。これを成し遂げるためだけに、私はインターネットの波を約12時間航海してきました.

~につJ

4

4 に答える 4

0

私はそれを解決することができました。

$data = Excel::load($path, function($reader) {

            $importedSlugs = $data->select(array('slug'))->toArray();
                    //collection of imported slugs
                    $collectionOfImportedSlugs = collect($importedSlugs)->flatten()->all();

                    //get all product slugs
                    $productSlugs = Product::all()->pluck('slug');

                    //get all different slugs!
                    $diffSlugsArray = $productSlugs->diff($collectionOfImportedSlugs)->all();
                    //dd($diffSlugsArray);

                    foreach ($diffSlugsArray as $diffSlug) {
                        $product_false = Product::all()->where('slug',     $diffSlug)->first();

                        echo $product_false->slug . 'has been deleted!';

                        $product_false->delete();
                    }
        })->get();
于 2016-09-16T13:26:42.863 に答える
0

これを試して

$product = Product::where('slug', $value->slug)->first();
$product_false = Product::whereRaw('slug != name')->get();

(string)whereと比較products.slugすると、 Simpleは機能しません。"name"

于 2016-09-16T09:15:29.017 に答える