Laravel Столбец не найден: 1054 Неизвестный столбец - PullRequest
0 голосов
/ 02 мая 2020

Мне нужно получить список продуктов торговой точки пользователя, но она возвращает эту ошибку

SQLSTATE[42S22]: Column not found: 1054 Unknown column '1' in 'on clause' (SQL: select * from `barcodes` inner join `outlet_products` on `1` = `outlet_products`.`outlet_id

Logi c

Получить список продуктов только торговой точки пользователя (не все продукты из всех розетки)

  1. Продукт basically just name and description (имеет много штрих-кодов)
  2. Штрих-код (принадлежит продуктам, принадлежит многим розеткам)
  3. Розетка (имеет много штрих-кодов)

Код

$user = $request->user();
$outlets = $user->outlets->pluck('id');

$products = Barcode::with('product', 'damages', 'outlet')
  ->join('outlet_products', function ($join) use($outlets) {
    $join->on($outlets, '=', 'outlet_products.outlet_id');
  })
  ->get();

Product model

public function barcodes()
{
    return $this->hasMany(Barcode::class, 'product_id', 'id');
}

Barcode model

public function product()
{
    return $this->belongsTo(Product::class);
}

public function outlet()
{
    return $this->belongsToMany(Outlet::class, 'outlet_products', 'barcode_id', 'outlet_id');
}

outlet model

public function barcodes()
{
    return $this->belongsToMany(Barcode::class, 'outlet_products', 'outlet_id', 'barcode_id');
}

Продукты торговых точек на самом деле возвращаются через штрих-коды (в торговой точке много штрих-кодов, и каждый штрих-код принадлежит продукту).

Есть идеи?

Обновление

Я сделал некоторые изменения в своем коде, и теперь это выглядит так:

$products = Barcode::with('product', 'damages', 'outlet')
  ->join('outlet_users', 'outlet_users.user_id', '=', $user->id)
  ->join('outlet_products', 'outlet_products.outlet_id', '=',  'outlet_users.outlet_id')
  ->get();

Теперь он возвращает эту ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column '4' in 'on clause' (SQL: select * from `barcodes` inner join `outlet_users` on `outlet_users`.`user_id` = `4` inner join `outlet_products` on `outlet_products`.`outlet_id` = `outlet_users`.`outlet_id`)

В основном с помощью этой новой функции я пытаюсь получить пользователя outlet.id и сопоставить его со штрих-кодом (product) outlet.id.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы на неправильном пути. Если вы хотите получать списки продуктов из списка розеток пользователей

Обновите модель розетки с помощью product_id.

В пути:

$user = $request->user();
$outlets = $user->outlets->pluck('id');

$products = Barcode::with('product','damages','outlet')
  ->whereHas('outlet', function ($q) use($outlets) {
    $q->whereIn('id',$outlets);
  })
  ->get();
0 голосов
/ 02 мая 2020

Эта строка неверна:

$join->on($outlets, '=', 'outlet_products.outlet_id');

$outlets содержит список идентификаторов, а не имя столбца.


Обновление: Более прямой подход к получению всех продуктов для конкретного пользователя с определенными моделями может быть примерно таким:

$products = Product::whereHas('barcodes', function (Builder $barcodesQuery) {
  $barcodesQuery->whereHas('outlet', function (Builder $outletQuery) {
    $outletQuery->whereHas('users', function (Builder $userQuery) {
      $userQuery->where('id', $user->id);
    });
  });
})->get();

Но вы должны добавить обратную связь users() к Outlet модели:

public function users()
{
    return $this->belongsToMany(User::class, 'outlet_users', 'outlet_id', 'user_id');
}

Не проверено ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...