【问题标题】:Eager loading with belongs_to model (laravel)使用 belongs_to 模型急切加载(laravel)
【发布时间】:2013-05-16 14:57:51
【问题描述】:

我有这两个类:

<?php
class Client extends Eloquent 
{
    public function orders() 
    { 
        return $this->has_many('Order'); 
    }
}

还有 Order 类:

<?php
class Order extends Eloquent 
{
    public function client() 
    { 
        return $this->belongs_to('Client'); 
    }
}

在我的控制器上,我正在使用以下方式加载订单:

$orders = Order::with('client')->order_by('id', 'asc');

它正在检索我的订单数据,实际上,它正在执行预加载查询:

SELECT * FROM `orders` ORDER BY `id` ASC LIMIT 10 OFFSET 0
SELECT * FROM `clients` WHERE `id` IN ('1')

我可以使用以下方式打印订单数据:

$order->id

但是,当打印客户端的数据时,使用:

$order->client->name

显示此错误:

"Trying to get property of non-object"

这是堆栈跟踪:

#0 /home/instakioski/laravel/laravel.php(42): Laravel\Error::native(8, 'Trying to get p...', '/home/instakios...', 136)
#1 /home/instakioski/laravel/view.php(386) : eval()'d code(136): Laravel\{closure}(8, 'Trying to get p...', '/home/instakios...', 136, Array)
#2 /home/instakioski/laravel/view.php(386): eval()
#3 /home/instakioski/laravel/blade.php(71): Laravel\View->get()
#4 [internal function]: Laravel\{closure}(Object(Laravel\View))
#5 /home/instakioski/laravel/event.php(199): call_user_func_array(Object(Closure), Array)
#6 /home/instakioski/laravel/event.php(138): Laravel\Event::fire('laravel.view.en...', Array, true)
#7 /home/instakioski/laravel/view.php(348): Laravel\Event::until('laravel.view.en...', Array)
#8 /home/instakioski/laravel/view.php(590): Laravel\View->render()
#9 /home/instakioski/laravel/response.php(268): Laravel\View->__toString()
#10 /home/instakioski/laravel/laravel.php(180): Laravel\Response->render()
#11 /home/instakioski/public/index.php(34): require('/home/instakios...')
#12 {main}

我做错了什么?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    dd($order->client) 看看它是否真的为空。如果该特定订单的 client_id 与现有客户端不匹配,则它可能为 null。另外,您在订单表“client_id”上的外键是什么?如果没有,您需要这样做:

    public function client() 
    { 
        return $this->belongs_to('Client', 'foreign_key'); 
    }
    

    其中“foreign_key”是数据库列的名称,其中包含该订单客户端的键。

    【讨论】:

    • 啊,是的!这是因为 client_id 不再存在。谢谢!
    【解决方案2】:

    调试你的结果:

    Kint 被提供所以sd($orders-&gt;toArray());

    基本上你在订单集合上迭代:

    foreach($orders as $order)
    

    $order 有一个客户

    $order->client->name
    
    ++@
    

    【讨论】:

    • 使用 dd($orders->toArray());不起作用,但 dd($orders) 显示我的 CLIENT 为 NULL。我在 foreach($orders as $order) 中使用 $order->client->name
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 2013-06-10
    • 2014-04-14
    • 2017-03-31
    • 2021-11-29
    • 2020-09-08
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多