Laravel 6.11: корзина HasMany :: fisrt () в Accessor не работает - PullRequest
0 голосов
/ 13 февраля 2020

РЕДАКТИРОВАТЬ: исправлены опечатки (сделано при переводе некоторого кода)

Я строю корзину с Laravel 6.11 (MAMP). Я получаю пару ошибок, которые сводят меня с ума. Пожалуйста помоги! Сначала я дам вам код, затем ошибки:

Тележки для таблиц:

id
order_date
arrived_date
status
user_id

Таблица cart_details:

id
cart_id
product_id
quantity
discount

Обратите внимание, что две таблицы ПУСТАЯ на данный момент, записи пока не вставлены.

В корзине может быть много деталей. Таким образом, в корзине. php у меня есть:

class Cart extends Model
{
    public function details()
    {
        return $this->hasMany(CartDetail::class);
    }
}

CartDetailController содержит:

class CartDetailController extends Controller
{
    //let's insert data in  cart_details so the order can be created
    public function store(Request $request)
    {

        $cartDetail = new CartDetail();

        $cartDetail->cart_id = auth()->user()->cart_identification;/* cart_id from the logged user. In User.php I have getCartIdentifitacionAttribute, I'm going to put the code right after this */

        $cartDetail->product_id = $request->product_id;
        $cartDetail->quantity = $request->quantity;

        $cartDetail->save();

        return back();
    }
}

У пользователя. php У меня есть:

  public function carts()
    {
        return $this->hasMany(Cart::class); //a user can have many carts
    }
    public function getCartIdentificationAttribute()
    {
        $cart = $this->carts()->where('status','Active')-> first();

        if($cart)
        {
            return $cart->id;
        }
        else// if there's no cart, let's create a new one
        {
            $cart = new Cart();
            $cart->status = 'Active';
            $cart->user_id = $this->id;
            $cart->save();
            return $cart->id;

       }
    }

.blade (который покажет администратору детали заказа):

@foreach (auth()->user()->cart_identification->details as $detail)

      <ul>
            <li>{{ $detail }}</li>
        </ul>
@endforeach

А теперь ошибки две ... безусловно связаны: (

  1. В страница продукта после нажатия «Добавить в корзину»:

    BadMethodCallException Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Relations \ HasMany :: fisrt ()

Если я печатаю $this->carts()->where('status','Active'), это работает, когда я добавляю ->fist(), ошибка показывает

При доступе к блейду как администратор должен сделать для обработки заказа:

Facade \ Ignition \ Exceptions \ ViewException Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Relations \ HasMany :: fisrt () (Просмотр: /Applications/MAMP/htdocs/app-shop/resources/views/home.blade.php)

Если я печатаю auth()->user(), это работает, это это auth()->user()->cart_identification, который вызывает ошибку.

Чего мне не хватает ??

Спасибо за тонну !!

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я думаю, у вас есть typo error.

Это должно быть

$cart = $this->carts()->where('status','Active')->first();

Не

 $cart = $this->carts()->where('status','Active')->fisrt();

И в вашей модели измените свой код на этот.

public function scopeCartIdentification()
    {
        $cart = $this->carts()->where('status','Active')->first();

        if($cart)
        {
            return $cart->id;
        }
        else// if there's no cart, let's create a new one
        {
            $cart = new Cart();
            $cart->status = 'Active';
            $cart->user_id = $this->id;
            $cart->save();
            return $cart->id;

       }
}

и позвоните в на ваш контроллер, как это

public function store(Request $request)
    {

        $cartDetail = new CartDetail();

        $cartDetail->cart_id = auth()->user()->CartIdentification();/* cart_id from the logged user. In User.php I have getCartIdentifitacionAttribute, I'm going to put the code right after this */

        $cartDetail->product_id = $request->product_id;
        $cartDetail->quantity = $request->quantity;

        $cartDetail->save();

        return back();
    }
0 голосов
/ 13 февраля 2020

Откуда происходит Auth () -> user () -> cart_identificacion ? Вы можете использовать такие отношения:

Auth::user()->carts->id

или использовать свою функцию так:

Auth::user()->getCartIdentificationAttribute()
...