【问题标题】:laravel/eloquent mutators/accessors in a pivot table数据透视表中的 laravel/eloquent 修改器/访问器
【发布时间】:2014-04-25 00:16:57
【问题描述】:

嗯,我认为标题解释了大部分内容。让我们开始吧!

空白模型:

class Blank extends Eloquent 
{

    protected $table = 'blanks';

    protected $softDelete = true;

    protected $hidden = array();

    /**
     * Get associated jobs.
     *
     * @return mixed
     */
    public function jobs()
    {
        return $this->belongsToMany('Job')->withPivot('status', 'inventory', 'sizes', 'mill', 'po', 'location', 'ordered_at', 'expected_at', 'note')->withTimestamps();
    }

    /**
     * Blanks sizes accessor
     *
     * @return object
     */
    public function getSizesAttribute($value)
    {
        return json_decode($this->pivot->sizes);
    }

    /**
     * Blanks sizes mutator
     *
     * @return void
     */
    public function setSizesAttribute($value)
    {
        $this->pivot->attributes['sizes'] = json_encode($this->pivot->sizes);
    }

}

工作模式:

class Job extends Eloquent
{

    protected $table = 'jobs';

    protected $softDelete = true;

    protected $hidden = array();

    /**
     * Get associated blank.
     *
     * @return mixed
     */
    public function blanks()
    {
        return $this->belongsToMany('Blank')->withPivot('status', 'inventory', 'sizes', 'mill', 'po', 'location', 'ordered_at', 'expected_at', 'note')->withTimestamps();
    }

    /**
     * Blanks sizes accessor
     *
     * @return object
     */
    public function getSizesAttribute($value)
    {
        return json_decode($this->pivot->sizes);
    }

    /**
     * Blanks sizes mutator
     *
     * @return void
     */
    public function setSizesAttribute($value)
    {
        $this->pivot->attributes['sizes'] = json_encode($this->pivot->sizes);
    }
}

附加代码:

$job->blanks()->attach($blank->id,[
    'status'      => Input::get('status'),
    'inventory'   => Input::get('inventory'),
    //'sizes'       => $sizes,
    'mill'        => Input::get('mill'),
    'po'          => Input::get('po'),
    'location'    => Input::get('location'),
    'ordered_at'  => Carbon::parse(Input::get('ordered_at'))->format('Y-m-d H:i:s'),
    'expected_at' => Carbon::parse(Input::get('expected_at'))->format('Y-m-d H:i:s'),
    'note'        => Input::get('note'),
]);

根本没有调用 mutator.. 有什么想法吗?

【问题讨论】:

  • 您希望调用哪个 mutator...以及何时调用?
  • 我会假设作业模型上的 mutator 'setSizesAttribute' 会被调用,因为我正在设置 'sizes'。它目前在代码中被注释掉,所以你可以看到它在哪里被调用。
  • 这只是在一个数组中,只有当你直接从模型实例中调用该值时才会调用突变器。如果您想在枢轴上使用变异器,则需要明确地为枢轴创建一个新模型。

标签: php laravel eloquent pivot-table


【解决方案1】:

似乎不可能通过 ::attach() 方法做到这一点。

但是也许你想使用'Defining A Custom Pivot Model'

public function newPivot(Model $parent, array $attributes, $table, $exists)
{
    return new YourCustomPivot($parent, $attributes, $table, $exists);
}

因此,您可以使用 mutators 定义自己的数据透视类:

class BlankJobPivot extends Eloquent
{
    // ...

    /**
     * Blanks sizes accessor
     *
     * @return object
     */
    public function getSizesAttribute($value)
    {
        return json_decode($value);
    }

    /**
     * Blanks sizes mutator
     *
     * @return void
     */
    public function setSizesAttribute($value)
    {
        $this->attributes['sizes'] = json_encode($value);
        return $value; // return for multiple assignment statement:  $arr = $pivot->sizes = array(12, 23, 34);
    }
}

你可以使用 getter:

$blank->jobs[$i]->pivot->sizes; // - ::getSizesAttribute() will called ( I hope :) )

也许您会通过setSizesAttribute mutator 找到save / attach 的方法。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2018-11-12
    • 2018-11-11
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多