laravel 雄辩的一对多关系返回 null

当我得到incoming_goods数据(belongsTo)时,产品数据总是返回null.

The product data always return null when i get the incoming_goods data (belongsTo).

这是我的产品型号:

<?php

namespace App;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class Product extends Model
{
    use SoftDeletes;

    protected $guarded = [
        'id', 'created_at', 'updated_at', 'deleted_at',
    ];

    public function transaction_details()
    {
        return $this->hasMany('AppTransaction_detail');
    }

    public function incoming_goods()
    {
        return $this->hasMany('AppIncoming_good');
    }       
}

这是我的 Incoming_good 模型:

Here is my Incoming_good Model:

<?php

namespace App;
use IlluminateDatabaseEloquentModel;

class Incoming_good extends Model
{
    protected $guarded = [
        'id', 'created_at', 'updated_at',
    ];

    public function product()
    {
        return $this->belongsTo('AppProduct');
    }       
}

这是我对那两个表的迁移:

And here is my migration of that two table:

产品表迁移:

<?php

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 50);
            $table->integer('price');
            $table->integer('stock')->nullable();
            $table->integer('available');
            $table->string('image1', 190)->nullable();
            $table->string('image2', 190)->nullable();
            $table->string('image3', 190)->nullable();
            $table->string('image4', 190)->nullable();
            $table->string('image5', 190)->nullable();
            $table->timestamps();
            $table->softDeletes();
        });
    }

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

incoming_goods 迁移:

incoming_goods migration:

<?php

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateTableIncomingGoods extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('incoming_goods', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('product_id');
            $table->integer('stock');
            $table->text('note')->nullable();
            $table->timestamps();
        });
    }

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

这是我的代码,用于显示 incomong_goods 数据和产品(关系属于):

Here is my code to show incomong_goods data and product (relation belongsTo):

$data = Incoming_good::select('id', 'stock', 'note', 'created_at')->with('product')->get();

我尝试使用 alies,但它仍然返回 null 的产品数据.希望你能帮助我:)

I've try to use alies, but still it return the product data null. Hope you can help me :)

推荐答案

为了将预先加载的 ProductIncoming_good 相匹配,Laravel 需要外部要选择的键.由于您没有在选择列表中包含外键 (product_id),Laravel 在检索它们后无法匹配相关记录.因此,您所有的 product 关系都将为空.将外键添加到选择列表中,你应该就好了.

In order to match up the eager loaded Products with the Incoming_goods, Laravel needs the foreign key to be selected. Since you did not include the foreign key (product_id) in the select list, Laravel can't match up the related records after retrieving them. So, all your product relationships will be empty. Add in the foreign key to the select list, and you should be good.

$data = Incoming_good::select('id', 'product_id', 'stock', 'note', 'created_at')
    ->with('product')
    ->get();

相关文章