Laravel 5 集合问题:哪里不等于
Laravel 5 collection issue: Where not equal to
我目前正在开发一个模式,用户可以在其中插入 excel 文件。系统的任务是上传 and/or 如果记录是新的或与数据库中现有的记录相同,则添加新的数据库记录。但是它还需要一个删除函数来删除 slug 列与名称列不相同的那些记录。
目前我正在使用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);
}
所有产品 returns 以上的 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 raw SQL(有效),我主要是想在集合中使用它:
SELECT * FROM `products` WHERE `slug` != `name`
希望有人帮我走出这个坑。为了完成这项工作,我已经在互联网上航行了大约 12 个小时。
~ nitsuJ
改变
$product = Product::all()->where('slug', $value->slug)->first();
$product_false = Product::all()->where('slug', '!=' , 'name')->get();
进入
$product = Product::where('slug', $value->slug)->first();
$product_false = Product::where('slug', '!=' , 'name')->get();
试试这个
$product = Product::where('slug', $value->slug)->first();
$product_false = Product::whereRaw('slug != name')->get();
简单 where
将无法工作,因为它将 products.slug
与 "name"
(string) 进行比较。
我设法解决了它。
$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();
集合,eloquent 和查询生成器不同。 Collection 提供了一堆方法来处理数组,而不是数据库或模型。
在集合上下文中 whereNot()
不可用。
但同样的功能可以通过whereNotIn('key', [value])
实现
collect([
[
'name' => 'foo',
'rank' => 2
],[
'name' => 'bar',
'rank' => 3
],[
'name' => 'foobar',
'rank' => 4
],
])->whereNotIn('rank', [4])
与where rank not in (4)
相同
我目前正在开发一个模式,用户可以在其中插入 excel 文件。系统的任务是上传 and/or 如果记录是新的或与数据库中现有的记录相同,则添加新的数据库记录。但是它还需要一个删除函数来删除 slug 列与名称列不相同的那些记录。
目前我正在使用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);
}
所有产品 returns 以上的 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 raw SQL(有效),我主要是想在集合中使用它:
SELECT * FROM `products` WHERE `slug` != `name`
希望有人帮我走出这个坑。为了完成这项工作,我已经在互联网上航行了大约 12 个小时。
~ nitsuJ
改变
$product = Product::all()->where('slug', $value->slug)->first();
$product_false = Product::all()->where('slug', '!=' , 'name')->get();
进入
$product = Product::where('slug', $value->slug)->first();
$product_false = Product::where('slug', '!=' , 'name')->get();
试试这个
$product = Product::where('slug', $value->slug)->first();
$product_false = Product::whereRaw('slug != name')->get();
简单 where
将无法工作,因为它将 products.slug
与 "name"
(string) 进行比较。
我设法解决了它。
$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();
集合,eloquent 和查询生成器不同。 Collection 提供了一堆方法来处理数组,而不是数据库或模型。
在集合上下文中 whereNot()
不可用。
但同样的功能可以通过whereNotIn('key', [value])
collect([
[
'name' => 'foo',
'rank' => 2
],[
'name' => 'bar',
'rank' => 3
],[
'name' => 'foobar',
'rank' => 4
],
])->whereNotIn('rank', [4])
与where rank not in (4)
相同