Laravel,如何忽略访问者

Jor*_*vol 13 php laravel eloquent laravel-4

我有一个带有自定义访问器的模型,所以我得到了自定义属性,

    class Order extends GSModel{

        $appends = ['orderContents'];

        public function getOrderContentsAttribute()
        {
            return $this->contents()->get();
        } 
 }
Run Code Online (Sandbox Code Playgroud)

但现在,在一个案例中,我只需要获得一些字段,而不需要这个字段OrderContents .

$openOrders         = Order::open()->has('contents')->get(['id','date','tableName']);
Run Code Online (Sandbox Code Playgroud)

但是这样做,它OrderContents也会让我回归......有没有办法不去那个领域?

谢谢!

sam*_*rap 30

令人失望的是,这里的人给了你错误的信息.实际上有一种内置的实现方法,直接写入Illuminate\Database\Eloquent\Model课堂,称为Model::getOriginal.

要检索foo属性,忽略其中定义的访问者Model::getFooAttribute,只需调用$myModel->getOriginal('foo');.这种方法是在线路定义3087Illuminate\Database\Eloquent\Model.

请记住,此方法获取模型上的原始值.这意味着如果您对该模型实例上的属性进行任何修改,则上述解决方案将不会反映这些修改.只要您只是检索该值,就应该没有问题.


Pri*_*nka 16

对于 Laravel <= 6.x,

有一个内置getOriginal方法可以从模型中获取原始值,而无需访问器。参见:6.x

$myModel->getOriginal('foo');
Run Code Online (Sandbox Code Playgroud)

对于 Laravel 7.x 和 8.x 和 9.x,

您应该使用getRawOriginal内置方法从模型中检索原始值。参见:9.x

$myModel->getRawOriginal('foo');
Run Code Online (Sandbox Code Playgroud)

7.x & 8.x & 9.x 中的方法getOriginal将通过访问器返回属性值。


Jar*_*zyk 15

没有办法一气呵成,所以这就是你需要的:

$openOrders = Order::open()->has('contents')->get(['id','date','tableName']);

$openOrders->each(function ($order) {
  $order->setAppends([]);
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以在最后一步使用Laravel的高阶消息:

$openOrders->each->setAppends([]);
Run Code Online (Sandbox Code Playgroud)

  • 现在可以这样做:`$ openOrders-> each-> setAppends([]);` (2认同)

luk*_*ter 7

好吧,我不是说这是一个很好的解决方案,但它可以工作,你可以使用循环...

将此添加到您的模型:

public static $withoutAppends = false;

protected function getArrayableAppends()
{
    if(self::$withoutAppends){
        return [];
    }
    return parent::getArrayableAppends();
}
Run Code Online (Sandbox Code Playgroud)

然后,当您要禁用$appends属性时:

Order::$withoutAppends = true;
$openOrders = Order::open()->has('contents')->get(['id','date','tableName']);
Run Code Online (Sandbox Code Playgroud)