【问题标题】:How to specify multiple One-To-One relations in Laravel Eloquent?如何在 Laravel Eloquent 中指定多个一对一关系?
【发布时间】:2017-10-08 12:42:05
【问题描述】:

我有两个模型:

Deal
 - id
 - seller
 - buyer
 - price
 - date

Person
 - id
 - name
 - balance
 - email

Deal 模型字段 sellerbuyer 包含 Person 模型实例。

在 Laravel Eloquent 中指定此模型的正确方法是什么?


我尝试这样做。数据库架构:

deals
 - id: int, primary
 - seller_id: int
 - buyer_id: int
 - price: decimal(10, 2)
 - date: datetime

people
 - id: int, primary
 - name: string
 - balance: decima(10, 2)
 - email: string

Eloquent 模型定义:

class Deal extends Model
{
    public function seller()
    {
        return $this->belongsTo(Person::class, 'seller_id');
    }

    public function buyer()
    {
        return $this->belongsTo(Person::class, 'buyer_id');
    }
}

class Person extends Model
{
    //
}

但是当我尝试创建一个新的Deal 实例时:

$seller = new Person();
$seller->name = 'Anna';
$seller->balance = 100500;
$seller->email = 'anna@exampe.com';

$buyer = new Person();
$buyer->name = 'Bob';
$buyer->balance = 9000;
$buyer->email = 'bob@exampe.com';

$deal = new Deal();
$deal->seller = $seller;
$deal->buyer = $buyer;
$deal->price = 99.99;
$deal->date = new Carbon();

$deal->save();

我收到一个错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'buyer' in 'field list'...

我做错了什么?

【问题讨论】:

    标签: php database laravel eloquent


    【解决方案1】:

    当您说$deal->seller 时,它会返回一个People 对象的实例,因为您已经以这种方式定义了您的关系。但是在保存的同时,您可以这样做。试试这个

    $seller = new Person();
    $seller->name = 'Anna';
    $seller->balance = 100500;
    $seller->email = 'anna@exampe.com';
    $seller->save(); // important
    
    $buyer = new Person();
    $buyer->name = 'Bob';
    $buyer->balance = 9000;
    $buyer->email = 'bob@exampe.com';
    $buyer->save(); // important
    
    $deal = new Deal();
    $deal->seller_id = $seller->id;
    // or $deal->seller()->associate($seller);
    $deal->buyer_id = $buyer->id;
    // or $deal->buyer()->associate($buyer);
    $deal->price = 99.99;
    $deal->date = new Carbon();
    
    $deal->save();
    

    【讨论】:

    • 谢谢!父实例检索以这种方式$seller = $deal->seller 工作,所以我希望关联以同样的方式工作。
    【解决方案2】:

    对于Belongs To Relationship,您应该使用associate 方法。

    您还需要先保存 Person 模型,以便您在数据库中拥有一个有效的 ID。

    $seller = new Person();
    $seller->name = 'Anna';
    $seller->balance = 100500;
    $seller->email = 'anna@exampe.com';
    $seller->save();
    
    $buyer = new Person();
    $buyer->name = 'Bob';
    $buyer->balance = 9000;
    $buyer->email = 'bob@exampe.com';
    $buyer->save();
    
    $deal = new Deal();
    $deal->seller()->associate($seller);
    $deal->buyer()->associate($buyer);
    $deal->price = 99.99;
    $deal->date = new Carbon();
    
    $deal->save();
    

    【讨论】:

    • 谢谢!父实例检索以这种方式$seller = $deal->seller 工作,所以我希望关联以同样的方式工作。
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2021-04-21
    • 2018-12-14
    • 1970-01-01
    • 2014-12-14
    • 2016-02-11
    相关资源
    最近更新 更多