SQLSTATE [42S22]:找不到列:1054 laravel中的未知列

时间:2018-07-28 20:24:19

标签: php mysql laravel

我正在尝试使用laravel来制作购物车,但遇到一种方法上的麻烦

这是错误:

  

SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'pedidos__produtos.pedidos_id'(SQL:从pedidos__produtos中选择id_produto,sum(total)作为Total,count(1)作为qtd其中pedidos__produtospedidos_id = 1和pedidos__produtospedidos_id不是null,按id_produto的顺序按id_produto desc)分组

我搜索了整个代码,但没有在任何地方引用此字段“ pedidos_id” 当我在Carrinhocontroller.php中调用“ $ pedidos [0]-> pedido_produtos”时,会发生此错误

这些是相关的方法和迁移:

CarrinhoController.php

<?php

 namespace App\Http\Controllers;

 use Illuminate\Http\Request;
 use App\Pedidos;
 use Illuminate\Support\Facades\Auth;

 class CarrinhoController extends Controller
 {
    function __construct(){
    $this->middleware('auth');
}

public function index(){

    $pedidos = Pedidos::where([
        'id_user' => Auth::id()
    ])->get();

    dd([
        $pedidos,
        $pedidos[0]->pedido_produtos,
        //$pedidos[0]->pedidos_produtos[0]->produto
    ]);
    return view('carrinho.index', compact('pedidos'));

 }
}

Pedidos.php

<?php

 namespace App;
 use Illuminate\Database\Eloquent\Model;

 class Pedidos extends Model
 {
    public function pedido_produtos(){
    return $this->hasMany('App\Pedidos_Produtos')
    ->select( \DB::raw('id_produto, sum(total) as Total, count(1) as qtd'))
    ->groupBy('id_produto')
    ->orderBy('id_produto', 'desc');
 }
}

Pedidos_Produtos.php

<?php

  namespace App;

  use Illuminate\Database\Eloquent\Model;

  class Pedidos_Produtos extends Model
   {
     public function produto(){
       return $this->belongsTo('App\Produtos', 'id_produto', 'id');
     }
 }

从Pedidos迁移:

<?php

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

 class CreatePedidosTable extends Migration
 {
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('pedidos', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('id_user')->unsigned();
        $table->foreign('id_user')->references('id')->on('users');
        $table->timestamps();
    });
}

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

以及pedidos_produtos

<?php

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

 class CreatePedidosProdutosTable extends Migration
 {
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('pedidos__produtos', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('id_pedido')->unsigned();
        $table->integer('id_produto')->unsigned();
        $table->decimal('total', 6, 2)->default(0);
        $table->timestamps();

        $table->foreign('id_pedido')->references('id')->on('pedidos');
        $table->foreign('id_produto')->references('id')->on('produtos');
    });
}

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

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

您遇到的问题可能与以下行有关:

return $this->hasMany('App\Pedidos_Produtos')

如果在定义hasMany关系时未明确告诉Laravel每个表调用的ID,它将假定ID为{table_name}_id,而pedidos_id就是来自此ID。 / p>

尝试将外键和本地键添加到hasMany中,如下所示:

return $this->hasMany('App\Pedidos_Produtos', 'id_pedido', 'id')

答案 1 :(得分:1)

如果未在hasMany方法上定义foreignKey属性,它将自动生成。 它根据classname_id模式生成字段名称。同样,localKey的默认值是PK类。

public function hasMany($related, $foreignKey = null, $localKey = null)

您可以这样使用。

 return $this->hasMany('App\Pedidos_Produtos','id_pedido')