añadir múltiples langue usando el paquete Astrotómico / laravel-translatable y laravel

Soy nuevo en laravel y uso Astrotómico / laravel-traductor paquete para la traducción Tengo problemas cuando quiero añadir dos langue al mismo tiempo. Tengo name_en,name_ar,discription_an,disriptionar como campos de entrada. Tengo este error Creating default object from empty valueasí como puedo resolver mi problema este es el enlace del paquete https://github.com/Astrotomic/laravel-translatable

// start add data
    public function store(CategoryRequest $request)
    {
    
            // prepare data
            $validatedData = array(
                'url' => $request->url,
                'slug' => $request->slug,
                'status' => $request->status,
                'last_updated_by' => auth('admin')->user()->id,
                'created_by'      => auth('admin')->user()->id,
                'created'         => time(),
            );
            $translated = array(
                'name_en' => $request->name_en,
                'name_ar' => $request->name_ar,
                'description_en' => $request->description_en,
                'description_ar' => $request->description_ar,
            );
            //start define categoru is sub or main
            $request ->sub ==1 ?  $validatedData['parent_id'] = $request ->category_id: $validatedData['parent_id']=null;
            // start update data
            DB::beginTransaction();
            $add = Category::create($validatedData);
            $id = $add->id;
    
            // strat update category report
            $categoryReport = CategoryReport::create(
                ['status'           =>$validatedData['status'],
                 'category_id'      =>$id,
                 'created_by'       =>$validatedData['created_by']
                 ,'last_updated_by' =>$validatedData['last_updated_by']]);
            $add->translate('ar')->name = $translated['name_ar'];
            $add->translate('en')->name = $translated['name_en'];
            $add->translate('ar')->description = $translated['description_ar'];
            $add->translate('en')->description =$translated['description_en'];
            $add ->save();
        DB::commit();
            return redirect()->back()->with('success','تم اضافه البيانات بنجاح');
    
    
    }

Pregunta hecha hace 3 años, 5 meses, 1 días - Por bytebarde61c


2 Respuestas:

  • El error "Creating default object from empty value" se produce cuando estás tratando de acceder a una propiedad de un objeto que no ha sido inicializado correctamente. En tu caso, parece que estás intentando acceder a las traducciones de un objeto de la clase Category sin haber inicializado correctamente las traducciones para los idiomas 'en' y 'ar'.

    Para resolver este problema, asegúrate de inicializar las traducciones para todos los idiomas que necesitas antes de intentar asignarles un valor. Puedes hacerlo de la siguiente manera:

    php
    // Inicializar las traducciones para los idiomas 'en' y 'ar'
    $add->setTranslation('name', 'en', $translated['name_en']);
    $add->setTranslation('name', 'ar', $translated['name_ar']);
    $add->setTranslation('description', 'en', $translated['description_en']);
    $add->setTranslation('description', 'ar', $translated['description_ar']);
    
    $add->save();
    

    De esta manera, estás asignando los valores de las traducciones para los idiomas 'en' y 'ar antes de intentar acceder a ellas. Este enfoque debería resolver el error que estás experimentando.

    Respondida el Dec 17, 2020 a las 16:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error Creating default object from empty value se produce porque estás intentando acceder a una propiedad de un objeto nulo. En este caso, el objeto nulo es $add->translate('ar').

    Para solucionar este problema, debes asegurarte de que el objeto $add no sea nulo antes de acceder a sus propiedades. Puedes hacerlo comprobando si el objeto $add es nulo antes de llamar a translate().

    Aquí tienes el código corregido:

    php
    if ($add) {
        $add->translate('ar')->name = $translated['name_ar'];
        $add->translate('en')->name = $translated['name_en'];
        $add->translate('ar')->description = $translated['description_ar'];
        $add->translate('en')->description =$translated['description_en'];
        $add ->save();
    }
    

    También te recomiendo que utilices el método firstOrCreate() en lugar de create() para crear el modelo. El método firstOrCreate() creará un nuevo modelo si no existe o devolverá el modelo existente si ya existe. Esto evitará que se produzcan errores si intentas crear un modelo que ya existe.

    Aquí tienes el código actualizado utilizando el método firstOrCreate():

    php
    $add = Category::firstOrCreate($validatedData);
    if ($add) {
        $add->translate('ar')->name = $translated['name_ar'];
        $add->translate('en')->name = $translated['name_en'];
        $add->translate('ar')->description = $translated['description_ar'];
        $add->translate('en')->description =$translated['description_en'];
        $add ->save();
    }
    

    Respondida el Dec 17, 2020 a las 16:36 - por Gemini

    Votos positivos: 0 | Votos negativos: 0