Laravel 5.2:dimsav在非对象上调用成员函数translateOrNew()

时间:2017-10-12 13:23:40

标签: php laravel laravel-5.2 translation

我正在使用 Laravel 5.2 包装dimsav laravel-translatable 6。*

这是我工作的控制器

$about = new About();
        $about->link = $request->link;
        $about->save();

        $localization = $request['localization'];
        //dd($localization);
        // check if locales arabic and english only
        $locales = array_keys($localization);
        foreach ($locales as $locale) {
            if (!in_array($locale, array('en', 'ar'))) {
                Session::flash('message', 'Lang Error');
                return Redirect::back();
            }
        }

        foreach ($localization as $locale => $parameters) {
            $about->translateOrNew($locale)->title = $parameters['title'];
            $about->translateOrNew($locale)->details = $parameters['details'];
        }

        $about->save();

但是当我尝试使用质量分配时

$input = $request->all();

        $localization = $input['localization'];
        // check if locales arabic and english only
        $locales = array_keys( $localization );
        foreach ( $locales as $locale ) {
            if ( ! in_array( $locale, array( 'en', 'ar' ) ) ) {
                Session::flash( 'message', 'Lang Error' );

                return Redirect::back();
            }
        }


        foreach ( $localization as $locale => $parameters ) {
            $input->translateOrNew( $locale )->title   = $parameters['title'];
            $input->translateOrNew($locale)->details = $parameters['details'];
        }
dd($input);


        About::create( $input );

出错了

  

在非对象

上调用成员函数translateOrNew()

任何帮助,请问我在这里做错了什么。

修改:

我的模特

    use Dimsav\Translatable\Translatable;
    use Illuminate\Database\Eloquent\Model;

    class About extends Model {
        use Translatable;


        public $translatedAttributes = [ 'title', 'details' ];
        protected $fillable = [ 'link' ];
    }

my abouttranslation model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class AboutTranslation extends Model
{
    public $timestamps = false;
    protected $fillable = ['title', 'details', 'about_id'];
}

2 个答案:

答案 0 :(得分:2)

在您的质量分配版本中,您将使用

获取数组
$input = $request->all();

您希望在该数组上使用函数translateOrNew(),因为该数组没有任何功能,因此该函数无效。您必须从其他地方调用该函数并使用create保存数组。我举一个简单的例子:

$input = $request->all();

$localization = $input['localization'];
// check if locales arabic and english only
$locales = array_keys( $localization );
foreach ( $locales as $locale ) {
    if ( ! in_array( $locale, array( 'en', 'ar' ) ) ) {
        Session::flash( 'message', 'Lang Error' );

        return Redirect::back();
    }
}

$input = array();
foreach ( $localization as $locale => $parameters ) {
    $input[About::translateOrNew( $locale )->title] = $parameters['title'];
    $input[About::translateOrNew($locale)->details] = $parameters['details'];
}
About::create( $input );

我必须承担很多事情,因为我不知道About模型是怎样的。另外,我假设此模型中有一个静态方法translateOrNew()。请提供有关您的脚本的更多信息,这将改善答案。

<强>更新

第二个想法,为什么不使用这个更简单的方法呢?

<?php
$input = $request->all();

$localization = $input['localization'];
// check if locales arabic and english only
$locales = array_keys( $localization );
foreach ( $locales as $locale ) {
    if ( ! in_array( $locale, array( 'en', 'ar' ) ) ) {
        Session::flash( 'message', 'Lang Error' );

        return Redirect::back();
    }
}

$model_about = new About();

$input = array();
foreach ( $localization as $locale => $parameters ) {
    $model_about->translateOrNew($locale)->title = $parameters['title'];
    $model_about->translateOrNew($locale)->details = $parameters['details'];
}
$model_about->save();

只需创建一个模型对象,使用它的功能并在之后保存它。

答案 1 :(得分:-1)

您忘记在模型类中包含以下内容。
在模型文件中使用\Dimsav\Translatable\Translatable;,位于以下文件中:\App\Article.php