雄辩的关系:cloumn不存在

ankush981

我是Laravel的新手,在破解人际关系的工作方式上有些困难。我正在构建一个简单的电子商务应用程序,其中每个用户都有一些订单,并且订单具有一个或多个子订单,并且每个子订单仅链接到一个项目(请不要对我的方案发表评论;现在,我只需要弄清楚Eloquent,以后将进行重构:))。

以下是我的模型:

class Order extends Model
{
    //timestamp
    protected $created_at;

    public function sub_orders() {
        return $this->hasMany('App\SubOrder');
    }

    public function user() {
        return $this->belongsTo('App\User');
    }
}

class SubOrder extends Model
{
    protected $fillable = array('delivery_date', 'quantity', 'total_price', 'delivery_status');

    public function item() {
        return $this->hasOne('App\Item');
    }

    public function order() {
        return $this->belongsTo('App\Order');
    }
}

class Item extends Model
{
    //note - slug is kind of categorization and is common to many items
    protected $fillable = array('sku', 'name', 'slug', 'unit_price');
}

以下是迁移:

class CreateOrdersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('orders', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamp('created_at');

            //foreign keys
            $table->unsignedInteger('user_id')->after('id');
            $table->foreign('user_id')->references('id')->on('users')            ->onDelete('cascade');
        });
    }

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


class CreateSubOrdersTable extends Migration
{
    public function up()
    {
        Schema::create('sub_orders', function (Blueprint $table) {
            $table->increments('id');
            $table->date('delivery_date');
            $table->decimal('quantity', 5, 2);
            $table->decimal('total_price', 7, 2);
            $table->enum('delivery_status', ['pending_from_farmer', 'ready_for_customer', 'out_for_delivery', 'delivered']);

            //foreign keys
            $table->unsignedInteger('order_id')->after('id');
            $table->foreign('order_id')->references('id')->on('orders')            ->onDelete('cascade');
            $table->unsignedInteger('item_id')->after('order_id');
            $table->foreign('item_id')->references('id')->on('items')            ->onDelete('cascade');
        });
    }

    public function down()
    {
        Schema::dropIfExists('sub_orders');
    }
}

class CreateItemsTable extends Migration
{
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->increments('id');
            $table->string('sku')->unique();
            $table->string('name');
            $table->string('slug');
            $table->decimal('unit_price', 5, 2);
        });
    }

    public function down()
    {
        Schema::dropIfExists('items');
    }
}

有问题的表达就是为什么我写App\Order::all()[0]->sub_orders[0]->item我的web.php,并得到了以下错误:

SQLSTATE[42703]: Undefined column: 7 ERROR: column items.sub_order_id does not exist
LINE 1: select * from "items" where "items"."sub_order_id" = $1 and ...
^ (SQL: select * from "items" where "items"."sub_order_id" = 1 and "items"."sub_order_id" is not null limit 1)

我不明白为什么要sub_order_iditems表中查找。这样做的正确方法是什么?

ow

总体:使用hasOne定义belongsTo一对一关系,这将影响Laravel查找外键的目标表。hasOne假设my_model_id目标表中有一个,并belongsTo假设target_model_id我的表中有一个

class SubOrder extends Model
{
  public function item() {
     return $this->hasOne('App\Item', 'id', 'item_id');
  }
}

或者

class SubOrder extends Model
{
  public function item() {
     return $this-> belongsTo('App\Item');
  }
}

根据Laravel Doc的说法

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

雄辩地基于模型名称确定关系的外键。在上述情况下,自动假定Phone模型具有user_id外键如果您希望重写此约定,则可以将第二个参数传递给hasOne方法:

$this->hasOne('App\Phone', 'foreign_key', 'local_key');

或定义关系的倒数

class Phone extends Model
{
    /**
     * Get the user that owns the phone.
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

在上面的示例中,Eloquent将尝试将Phone模型中的user_id与User模型中id进行匹配

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章