Laravel 4 - 外键约束失败

时间:2014-03-07 20:36:25

标签: php mysql orm laravel

我有以下关系:

折扣:

<?php
    class Discount extends Eloquent {
        protected $table = 'discount';
        public $timestamps = true;

        public function title()
        {
            return $this->hasOne('Translation', 'labelId', 'titleLabelId')->where('languageId', T::getLang())->first()['phrase'];
        }

        public function titles()
        {
            return $this->hasMany('Translation', 'labelId', 'titleLabelId');
        }

    }
?>

翻译:

 <?php
        class Translation extends Eloquent {
            protected $table = 'translations';
            public $timestamps = false;

            protected $fillable = array('phrase', 'languageId', 'labelId');

            public function language()
            {
                return $this->belongsTo('Language', 'languageId');
            }

            public function label()
            {
                return $this->belongsTo('Label', 'labelId');
            }


}
?>

标签:

<?php
    class Label extends Eloquent {
        protected $table = 'label';
        public $timestamps = false;

        protected $fillable = array('key');

        public function translations()
        {
            return $this->hasMany('Translation', 'labelId', 'id');
        }
    }
?>

有三个数据库表,其中包含以下列:

折扣:

id | titleLabelId

翻译:

id | languageId | labelId

标签:

ID

问题:我想创建一个标题(翻译)并将其与折扣相关联。这是我尝试过的:

$discount = new Discount;

   /*create a new label*/

   $labelKey = Label::max('key') + 1;
   $label = new Label(array('key' => $labelKey));
   $label->save();

   /*create a new title (and associate it with the label)*/

   $title = new Translation(
   array(
    'phrase' => $input['title'],
    'languageId' => 3,
    'labelId' => $label->id
   ));

   $title->save();

   $discount->save();

   $discount->titles()->save($title);

显然,$discount->titles()->save($title);部分不起作用。如果手动执行,标题仅附加到折扣:$discount->titleLabelId = $label->id。有没有办法使用ORM来做到这一点?

2 个答案:

答案 0 :(得分:1)

当尝试通过Eloquent中定义的关系将一个模型与另一个模型相关联时,您应该使用associate()方法而不是save()方法。

$discount->titles()->associate($title);

在此之前,您应该确保对任何已更改或新的内容调用save()方法。

答案 1 :(得分:1)

在您的折扣模型中,您是否已将关系设置为使用正确的表和外键?

class Discount extends Eloquent
{
    public function titles()
    {
        return $this->belongsTo('Translation', 'translations', 'titleLabelId');
    }
}