在Laravel5中,插入一对一关系不起作用

时间:2015-02-28 08:44:42

标签: php laravel relational-database laravel-5

我有两个表:client和payment_term。我希望保存客户表,同时保持与付款期限的关系。

我的模型类是:

class Client extends Model {
    public function payment_term() {
        return $this->hasOne('App\Model\PaymentTerm');
    }
}

class PaymentTerm extends Model {
    public function client() {
        return $this->hasOne('App\Model\client');
    }
}

我需要插入带有payment的客户端。我的代码如下所示但不起作用,

$client = new Client();
$client->name = Input::get('name');
$client->save();
//Payment term
$term = PaymentTerm::findOrFail(Input::get('term_id'));
$client->payment_term()->save($term);          
}

你能帮我解决这个问题吗?我已经完成了文档和其他一些问题,但是没有一个能为我工作。我也想知道插入相关模型的最佳实践。

2 个答案:

答案 0 :(得分:1)

您的关系设置不正确。 hasOne关系的补充是belongsTo关系。此外,它是包含belongsTo侧的外键字段的模型。

从代码中,它看起来像你设置它,以便客户端表有一个term_id字段(payment_term记录的外键)。如果是这种情况,您的关系应该是:

class Client extends Model {
    public function payment_term() {
        return $this->belongsTo('App\Model\PaymentTerm', 'term_id');
    }
}

class PaymentTerm extends Model {
    public function client() {
        return $this->hasOne('App\Model\Client', 'term_id');
    }
}

您可以在文档here中找到有关Laravel关系的更多信息。

答案 1 :(得分:0)

我不确定,但我认为你的$ client-> save()导致了这个问题。

请尝试使用此代码 -

$client = new Client();
$client->name = Input::get('name');
//Payment term
$term = PaymentTerm::findOrFail(Input::get('term_id'));
$term->client()->save($client);          

此外,您可能需要将App\Model\client更改为App\Model\Client

关于最佳做法我认为文档中的代码示例可以帮助您 - http://laravel.com/docs/5.0/eloquent#inserting-related-models