मैं एक Laravel मॉडल में प्राथमिक कुंजी के रूप में एक uuid सेट करने का प्रयास कर रहा हूँ। मैंने इसे यहां के रूप में अपने मॉडल में बूट विधि सेट करके किया है, इसलिए मैं नहीं हर बार जब मैं मॉडल बनाना और सहेजना चाहता हूं तो इसे मैन्युअल रूप से बनाना होगा। मेरे पास एक नियंत्रक है जो सिर्फ मॉडल बनाता है और इसे डेटाबेस में सहेजता है।

यह डेटाबेस में सही ढंग से सहेजा जाता है लेकिन जब नियंत्रक आईडी का मान लौटाता है तो हमेशा 0 के साथ वापस आ जाता है। मैं इसे वास्तव में उस मूल्य को वापस करने के लिए कैसे बना सकता हूं जो वह डेटाबेस में बना रहा है?

मॉडल

class UserPersona extends Model
{
    protected $guarded = [];

    protected $casts = [
        'id' => 'string'
    ];

    /**
     *  Setup model event hooks
     */
    public static function boot()
    {
        parent::boot();
        self::creating(function ($model) {
            $uuid = Uuid::uuid4();
            $model->id = $uuid->toString();
        });
    }
}

नियंत्रक

class UserPersonaController extends Controller
{
    public function new(Request $request)
    {
        return UserPersona::create();
    }
}
2
Alberto 15 अप्रैल 2020, 12:03

1 उत्तर

सबसे बढ़िया उत्तर

आपको keyType से string और incrementing को false में बदलना होगा। चूंकि यह बढ़ नहीं रहा है।

public $incrementing = false;
protected $keyType = 'string';

इसके अतिरिक्त मेरे पास एक trait है जिसे मैं केवल उन मॉडलों में जोड़ता हूं जिनमें UUID कुंजियाँ हैं। जो काफी फ्लेक्सिबल है। यह मूल रूप से https://garrettstjohn.com/articles/using-uuid से आता है। -लारावेल-एलोक्वेंट-ओआरएम/ और मैंने इसमें कुछ छोटे समायोजन जोड़े हैं, जिन्हें मैंने इसका गहन उपयोग करते हुए पाया है।

use Illuminate\Database\Eloquent\Model;
use Ramsey\Uuid\Uuid;

/**
 * Class Uuid.
 * Manages the usage of creating UUID values for primary keys. Drop into your models as
 * per normal to use this functionality. Works right out of the box.
 * Taken from: http://garrettstjohn.com/entry/using-uuids-laravel-eloquent-orm/
 */
trait UuidForKey
{

    /**
     * The "booting" method of the model.
     */
    public static function bootUuidForKey()
    {
        static::retrieved(function (Model $model) {
            $model->incrementing = false;  // this is used after instance is loaded from DB
        });

        static::creating(function (Model $model) {
            $model->incrementing = false; // this is used for new instances

            if (empty($model->{$model->getKeyName()})) { // if it's not empty, then we want to use a specific id
                $model->{$model->getKeyName()} = (string)Uuid::uuid4();
            }
        });
    }

    public function initializeUuidForKey()
    {
        $this->keyType = 'string';
    }
}

उम्मीद है ये मदद करेगा।

4
Christoph Kluge 15 अप्रैल 2020, 12:12