Laravel 反向关联对象是否与原始对象相同?

Laravel 反向关联对象是否与原始对象相同?,laravel,eloquent,Laravel,Eloquent,我已经使用Laravel好几个月了,这让我很烦恼 考虑下面的例子 有两个雄辩的模型,其关系定义如下 class Customer extends \Illuminate\Database\Eloquent\Model { public function orders() { return $this->hasMany(Order:class); } } class Order extends \Illuminate\Database\Eloque

我已经使用Laravel好几个月了,这让我很烦恼

考虑下面的例子

有两个雄辩的模型,其关系定义如下

class Customer extends \Illuminate\Database\Eloquent\Model
{
    public function orders()
    {
        return $this->hasMany(Order:class);
    }
}


class Order extends \Illuminate\Database\Eloquent\Model
{
    public function customer()
    {
        return $this->belongsTo(Customer:class);
    }
}


$customer1 = Customer::select()
    //->where('id', '=', 1)
    ->with('orders')
    ->first();

$customer2 = $customer1->orders[0]->customer;

if ($customer1 === $customer2) {
    echo 'Same'. PHP_EOL;
} else {
    echo 'Not the same'. PHP_EOL;
}

$customer1
$customer2
应该相同。但事实并非如此。
我想要的是,
$customer1
$customer2
是一样的,就像

使用单词same,我的意思是它们应该是相同的实例,而不是具有相同客户数据的两个实例


我错过什么了吗?任何帮助都将不胜感激。

Laravel没有活动记录实施。没有主控器跟踪从数据库中获取的对象。每个对象跟踪自己的更改,但不知道内存中存在的其他对象。

从您的关系中,您可以看到每个客户都可以有多个订单,订单必须有一个客户。所以在$customer1变量中,有一个雄辩的模型对象,在$customer2中有一个id。如何比较它们??试着在ID和ID之间进行比较。拉威尔并没有按照你所期望的方式工作

  $customer1 = Customer::select()
        //->where('id', '=', 1)
        ->with('orders')
        ->first();

    $customer2 = $customer->orders[0]->customer;

    if ($customer1->id === $customer2) {
        echo 'Same'. PHP_EOL;
    } else {
        echo 'Not the same'. PHP_EOL;
    }

$customer1
$customer2
包含完全相同的数据,对吗?所以它们应该是同一个实例。不,它们不一样$customer1是有说服力的对象,$customer2是普通id为什么
$customer2
是普通id?您能解释一下吗?$customer1->orders[0]->customer这里您访问的是一个对象,然后是一个数组,然后是一个普通列,它实际上是该列的值,您从$customer1访问。所以$customer2只是$customer1对象的一个值形式,它是一对多关系。每个客户都有很多订单。因此,
$customer1->orders
将是一个订单数组。同时,
$customer1->orders[0]
将是一个有说服力的实例,而
$customer1->orders[0]->customer
将是一个客户。看起来没有办法“告诉”
$orders
您的客户已经被拉出来了,您不需要再次从数据库中拉出来。