У меня есть модель с пользовательским аксессуаром, поэтому я получаю этот пользовательский атрибут,
class Order extends GSModel{ $appends = ['orderContents']; public function getOrderContentsAttribute() { return $this->contents()->get(); } }
Но теперь, в одном случае, мне нужно получить только некоторые поля, без этого OrderContents
.
$openOrders = Order::open()->has('contents')->get(['id','date','tableName']);
Но, делая это таким образом, он возвращает мне OrderContents
. Есть ли способ не получить это поле?
Благодаря!
Невозможно сделать это за один раз, так что вот что вам нужно:
$openOrders = Order::open()->has('contents')->get(['id','date','tableName']); $openOrders->each(function ($order) { $order->setAppends([]); }); // or using collection magic: $openOrders->each->setAppends([]);
-$openOrders = Order::open()->has('contents')->get(['id','date','tableName']); $openOrders->each(function ($order) { $order->setAppends([]); }); // or using collection magic: $openOrders->each->setAppends([]);
Разочарование того, что люди здесь дали вам ложную информацию. На самом деле существует встроенный метод достижения этого, написанный прямо в класс Illuminate\Database\Eloquent\Model
, называемый Model::getOriginal
.
Чтобы получить атрибут foo
, игнорируя его accessor, определенный в Model::getFooAttribute
, просто вызовите $myModel->getOriginal('foo');
, Этот метод определен в строке 3087 Illuminate\Database\Eloquent\Model
.
Имейте в виду, что этот метод получает исходное значение для модели. Это означает, что если вы внесете какие-либо изменения в атрибут экземпляра модели, указанное выше решение не будет отражать эти изменения. Пока вы просто извлекаете значение, у вас не должно возникнуть проблемы.
Хорошо, я не говорю, что это хорошее решение, но оно работает, и вы обойдетесь с помощью цикла …
Добавьте это в свою модель:
public static $withoutAppends = false; protected function getArrayableAppends() { if(self::$withoutAppends){ return []; } return parent::getArrayableAppends(); }
Затем, когда вы хотите отключить свойства $appends
:
Order::$withoutAppends = true; $openOrders = Order::open()->has('contents')->get(['id','date','tableName']);