Laravel Mutator SQLSTATE सामान्य त्रुटि 1364 फ़ील्ड 'x' का डिफ़ॉल्ट मान नहीं है - mysql, laravel, laravel-5, laravel-5.4, backpack-for-laravel

मैं इस मुद्दे की जांच कर रहा हूं और मैंने पाया कि यह किस कारण से हुआ। प्रश्न के नीचे देखें

मैं Laravel 5.4 पर हूँ और अपने व्यवस्थापक इंटरफ़ेस के रूप में BackPackForLaravel का उपयोग कर रहा हूँ।

मेरे पास एक GenreTableMigration बंदे की तरह:

Schema::create("genres", function (Blueprint $table) {
$table->increments("id");
$table->string("name");
$table->string("slug")->default("");
$table->string("image");
$table->enum("status", ["PUBLISHED", "DRAFT"])->default("PUBLISHED");
$table->boolean("featured")->default(0);
$table->timestamps();
$table->softDeletes();
});

ध्यान दें image स्तंभ गैर-अशक्त है और इसका कोई डिफ़ॉल्ट मान नहीं है मेरे मॉडल में Genre इसके साथ:

protected $fillable = ["slug", "name", "image", "status", "featured"];

मेरे पास उत्परिवर्ती भी है image मेरे मॉडल में कॉलम:

/**
* Store Image
*/

public function setImageAttribute($value)
{
$attribute_name = "image";
$disk = "public";
$destination_path = "Albums";

// if the image was erased
if ($value == null) {
// delete the image from disk
Storage::disk($disk)->delete($this->image);

// set null in the database column
$this->attributes[$attribute_name] = null;
}

// if a base64 was sent, store it in the db
if (starts_with($value, "data:image")) {
// 0. Make the image
$image = Image::make($value);
// 1. Generate a filename.
$filename = md5($value . time()) . ".jpg";
// 2. Store the image on disk.
Storage::disk($disk)->put($destination_path . "/" . $filename, $image->stream());
// 3. Save the path to the database
$this->attributes[$attribute_name] = $destination_path . "/" . $filename;
}
}

और मेरा GenresTableSeeder:

$path = base_path("seeder-resources/GenresPhotos");

DB::table("genres")->delete();

$genres = [
[
"name" => "Pop",
"image" => "$path/Pop.jpeg",
"status" => "PUBLISHED",
"featured" => mt_rand(0, 1),
"created_at" => Carbon::now()->format("Y-m-d H:i:s"),
"updated_at" => Carbon::now()->format("Y-m-d H:i:s"),
],
];

foreach ($genres as $genre) {
$this->command->info(print_r($genre));
Genre::create($genre);
}

जब मैं उपयोग करता हूँ GenreCrudController और उपयोग करें Add Genre बटन सब कुछ ठीक काम करता है और पंक्ति बनाई जाती है, लेकिन जब मैं तालिका को सीड करने की कोशिश करता हूं तो मुझे मेरे कंसोल पर निम्न त्रुटि मिलती है।

  [IlluminateDatabaseQueryException]
SQLSTATE[HY000]: General error: 1364 Field "image" doesn"t have a default v
alue (SQL: insert into `genres` (`name`, `status`, `featured`, `created_at`
, `updated_at`, `slug`) values (Pop, PUBLISHED, 0, 2017-03-10 08:43:15, 201
7-03-10 08:43:15, pop))

भले ही मैं सेट करूं image मान (जो एक स्ट्रिंग कॉलम है) $genres सरणी Anything। मैंने भी नीचे की तरह स्पष्ट रूप से बीज लगाने की कोशिश की:

$genre = new Genre();
$genre->name = "Pop";
$genre->image = "anything";
$genre->status = "PUBLISHED";
$genre->featured = 1;
$genre->save();

कंसोल में अभी भी वही त्रुटि है। क्या किसी को कोई ख़याल है?

अद्यतन करें तो मैं बदल गया हूँ image स्तंभ का नाम somestring और अजीब तरह से पर्याप्त बीज बोने वाला काम किया। मैंने डालने की कोशिश की image किसी अन्य तालिका में कॉलम, कहने दो Articles तालिका और गयी "image" => "test" मेरे में ArticlesTableSeeder और फिर से यह काम किया। फिर मैंने "उसी म्यूटेटर को जोड़ा Article मॉडल और बूम! image मेरी तालिका में आउटपुट NULL था। किसी को भी कोई सुराग क्यों मेरी है setImageAttribute उत्परिवर्ती इस मुद्दे का कारण बनता है?

उत्तर:

जवाब के लिए 0 № 1

कृपया अपने माइग्रेशन में नीचे की तरह बदलाव करें और कोशिश करें:

Schema::create("genres", function (Blueprint $table) {
$table->increments("id");
$table->string("name")->nullable();
$table->string("slug")->nullable()->default("");
$table->string("image")->nullable();
$table->enum("status", ["PUBLISHED", "DRAFT"])->default("PUBLISHED");
$table->boolean("featured")->default(0);
$table->timestamps();
$table->softDeletes();
});

कृपया अपने स्ट्रिंग फ़ील्ड्स को अशक्त () प्रदान करें।


जवाब के लिए 0 № 2

पहला: यदि आप डेटाबेस में डिफ़ॉल्ट मान का उपयोग करते हैं, तो कृपया इसे पसंद करें (अशक्त के साथ): $table->string("slug")->nullable()->default(""); और लार्वा सही नए रिकॉर्ड नहीं बनाते हैं।

दूसरा: उपयोग करने का प्रयास करें "image" => $path."/Pop.jpeg"

मुझे यकीन नहीं है, लेकिन शायद आप स्ट्रिंग से बच रहे होंगे "image" => $path."/Pop.jpeg"


जवाब के लिए 0 № 3

तो मैंने पाया कि म्यूटेटर setImageAttribute केवल Null या base64 स्वीकार किए जाते हैं $value और मैं इमेज फाइल को सीड करने की कोशिश कर रहा था और जब यह फेल हुआ तो मैं एक स्ट्रिंग को सीड करने की कोशिश कर रहा था। मैं इसके बजाय इस म्यूटेटर के साथ आया और इसने पूरी तरह से काम किया:

/**
* Store Image
*/
public function setImageAttribute($value)
{
$attribute_name = "image";
$disk = "public";
$destination_path = "Genres";

// if the image was erased
if ($value == null) {
// delete the image from disk
Storage::disk($disk)->delete($this->image);

// set null in the database column
$this->attributes[$attribute_name] = null;
} // if a base64 was sent, store it in the db
elseif (starts_with($value, "data:image")) {
// 0. Make the image
$image = Image::make($value);
// 1. Generate a filename.
$filename = md5($value . time()) . ".jpg";
// 2. Store the image on disk.
Storage::disk($disk)->put($destination_path . "/" . $filename, $image->stream());
// 3. Save the path to the database
$this->attributes[$attribute_name] = $destination_path . "/" . $filename;
} // else if a file was sent
else {
// 0. Convert the image to jpeg format
$image = Image::make($value)->encode("jpg", 100);
// 1. Generate a filename
$filename = md5($value . time()) . ".jpg";
// 2. Store the image on disk
Storage::disk($disk)->put($destination_path . "/" . $filename, $image->stream());
// 3. Save the path to databse
$this->attributes[$attribute_name] = $destination_path . "/" . $filename;
}
}

संबंधित सवाल
सबसे लोकप्रिय