SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'items.box_box_barcode' в 'where clause' - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь отобразить данные из 2 таблиц базы данных (boxes и items), которые имеют 2 модели с отношением один-ко-многим в Laravel 5.8. Когда я пытаюсь отобразить данные в моем представлении, я получаю следующую ошибку:

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'items.box_box_barcode' в 'выражении where' (SQL: выберите * из `items`, где` items` `box_box_barcode` = TRTB0001 и` items` `box_box_barcode` не равно нулю)

См. мой код:

Box. php (модель)

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Box extends Model
{

    protected $guarded = [];


    protected $primaryKey = 'box_barcode';
    public $incrementing = false;
    protected $keyType = 'string';



    public function items(){

        return $this->hasMany(Item::class);
    }
}

Item. php (модель)

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{

    protected $primaryKey = 'item_barcode'; // or null

    public $incrementing = false;

    // In Laravel 6.0+ make sure to also set $keyType
    protected $keyType = 'string';


    public function company(){

        return $this->belongsTo(Company::class);
    }
}

create_boxes_table. php (миграция 1)

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBoxesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('boxes', function (Blueprint $table) {
            //$table->bigIncrements('id');
            $table->string('box_barcode')->primary();
;      //want this to be my id that can increment
            $table->string('sort_description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('boxes');
    }
}

create_items_table. php (миграция 2)

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            //$table->bigIncrements('id');
            $table->string('item_barcode')->primary();
; //want this to be my id that can increment
            $table->string('its_box_barcode');
            $table->string('item_quality');
            $table->timestamps();


        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('items');
    }
}

boxesController. php (контроллер)

<?php

namespace App\Http\Controllers;

use App\Box;
use Illuminate\Http\Request;

class boxesController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $boxes = Box::all();       
        return view('boxes.index', compact('boxes'));
    }


    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Box  $box
     * @return \Illuminate\Http\Response
     */
    public function show(Box $box)
    {
        return view('boxes.show', compact('box'));
    }


}

index.blade. php (просмотр)

@extends('layout')


@section('title', 'Boxes')  


@section('content')


    <h1>Boxes</h1>

     <ul style="list-style-type: none;">

       @foreach($boxes as $box) 

         <li>
            <a href="/boxes/{{ $box->box_barcode }}">
                {{$box->box_barcode}}  
            </a>
         </li>

       @endforeach

    </ul>           

 @endsection

show.blade. php (просмотр)

@extends('layout')


@section('title', 'Show Box')  


@section('content')


@if ($box->items->count())
    <div>
        @foreach ($box->items as $item)

            <div>

                <form method="POST" action="/items/{{ $item->id }}">
                    @method('PATCH')
                    @csrf

                    <!-- USE TO STRIKETHROUGH A CONPLETED TASK IN WEB PAGE -->
                    <label class="checkbox {{ $item->in ? 'is-complete' : '' }}" for="in" >

                    <input type="checkbox" name="in" onChange="this.form.submit()" {{ $item->in ? 'checked' : '' }}>
                            {{ $item->item_barcode }}

                    </label>


                </form>



            </div>

        @endforeach

    </div>
@endif

@endsection

1 Ответ

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

Используя странные имена для столбцов, вы теряете много того, что Laravel обычно делает автоматически. Но, как указано в документации , вы можете "переопределить внешний и локальный ключи, передав дополнительные аргументы методу hasMany."

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Box extends Model {
    protected $guarded = [];
    protected $primaryKey = 'box_barcode';
    public $incrementing = false;
    protected $keyType = 'string';

    public function items() {
        return $this->hasMany(Item::class, 'its_box_barcode', 'box_barcode');
    }
}

Вам также необходимо определить обратную связь между элементы и ящики, опять же используя ваши нестандартные имена столбцов.

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Item extends Model {

    protected $primaryKey = 'item_barcode'; // or null
    public $incrementing = false;
    protected $keyType = 'string';


    public function box() {
        return $this->belongsTo(Box::class, 'its_box_barcode', 'box_barcode');
    }
}

Мы бы посоветовали придерживаться ожидаемого соглашения об именах платформы, чтобы избежать многих проблем. то есть boxes.box_barcode должно быть boxes.barcode, items.item_barcode должно быть items.barcode, а items.its_box_barcode должно быть items.box_id, указывая на стандартный числовой столбец c, называемый id. Да, это немного расточительно, если у вас уже есть другое уникальное значение в базе данных, но вы будете бороться с соглашением, если вы поступите иначе. Поэтому мой предложенный код модели был бы очень прост:

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Box extends Model {
    public function items() {
        return $this->hasMany(Item::class);
    }
}

class Item extends Model {
    public function box() {
        return $this->belongsTo(Box::class);
    }
}

Вы должны также определить эти отношения на уровне базы данных, используя ограничения внешнего ключа в ваших миграциях:

Schema::create('boxes', function (Blueprint $table) {
    $table->bigIncrements('id')->primary();
    $table->string('barcode');
    $table->string('sort_description');
    $table->timestamps();
});

Schema::create('items', function (Blueprint $table) {
    $table->bigIncrements('id')->primary();
    $table->string('box_id');
    $table->string('barcode');
    $table->string('quality');
    $table->timestamps();
    $table->foreign('box_id')->references('id')->on('boxes')->onDelete('cascade');
});

Теперь в вашем шаблоне вы можете ссылаться на такие вещи:

@foreach ($boxes as $box)
    {{ $box->barcode }} 
    @foreach ($box->items as $item)
        {{ $item->barcode }}
    @endforeach
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...