Laravel:hasMany Relationship为null / empty

时间:2016-02-10 04:43:07

标签: php laravel eloquent relationship laravel-5.2

我的问题是,我的hasMany关系只返回一个"空"系列:

Collection {#172 ▼
  #items: array:1 [▼
    0 => 0
  ]
}

我的belongsTo关系只返回" null"。

以下是雄辩:     Game.php     

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

/**
 * App\Models\Game
 *
 * @property integer $id
 * @property integer $steamid
 * @property string $name
 * @property \Carbon\Carbon $created_at
 * @property \Carbon\Carbon $updated_at
 */
class Game extends Model
{
    protected $fillable = [
        'appid', 'name'
    ];

    public function keys()
    {
        $this->hasMany('App\Models\Game\Key', 'id', 'game_id');
    }
}

Key.php
<?php

namespace App\Models\Game;

use Illuminate\Database\Eloquent\Model;

/**
 * App\Models\Game\Key
 *
 */
class Key extends Model
{
    protected $fillable = [
        'key', 'game_id', 'author_id',
    ];

    public static function getRandom()
    {
        if (!self::available()) return false;
        $keys = Key::where('redeemer_id', 0)->get();
        $key = $keys[ rand(0, count($keys) - 1) ];
        return $key;
    }

    public static function available()
    {
        $keys = Key::where('redeemer_id', 0)->get();
        $count = count($keys);
        if ($count > 0) return $count;
        return false;
    }

    public function author()
    {
        $this->hasOne('App\Models\User', 'author_id');
    }

    public function redeemer()
    {
        $this->hasOne('App\Models\User', 'redeemer_id');
    }

    public function game()
    {
        $this->belongsTo('App\Models\Game', 'game_id');
    }
}

User.php
<?php

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Foundation\Auth\User as Authenticatable;

/**
 * App\Models\User
 *
 * @property integer $id
 * @property string $name
 * @property string $email
 * @property string $password
 * @property string $remember_token
 * @property \Carbon\Carbon $created_at
 * @property \Carbon\Carbon $updated_at
 */
class User extends Authenticatable
{
    protected $fillable = [
        'username', 'email', 'password'
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    public function keys()
    {
        $this->hasMany('App\Models\Game\Key');
    }

    public function canRedeem()
    {
        // TODO: not tested yet
        if(count(self::keys()) == 0) return true;
        if(Carbon::now(-24) > self::keys()->first()->created_at) return true;
            return false;
    }
}

这些是我的迁移:

user-table
<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('username')->unique();
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

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

game-table
<?php

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

class CreateGamesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        if (!Schema::hasTable('games')) {
            Schema::create('games', function (Blueprint $table) {
                $table->increments('id');

                $table->integer('appid')->unsigned();
                $table->string('name');

                $table->timestamps();
            });
        }
    }

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

keys-table
<?php

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

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

            $table->string('key');

            $table->integer('game_id')->unsigned()->index();
            $table->foreign('game_id')->references('id')->on('games')->onDelete('cascade');

            $table->integer('author_id')->unsigned()->index();
            $table->integer('redeemer_id')->unsigned()->index();

            $table->timestamps();


        });
    }

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

我googled很多,我发现了一些&#34;解决方案&#34;在Laracast,但他们只告诉我我已经拥有的东西。

有人可以帮忙吗? Deazl

2 个答案:

答案 0 :(得分:7)

创建关系的方法必须返回一个值,这就是我所说的:

而不是:

public function keys()
{
    $this->hasMany('App\Models\Game\Key', 'id', 'game_id');
}

你应该:

public function keys()
{
    return $this->hasMany('App\Models\Game\Key', 'id', 'game_id');
}

不同之处在于return语句,创建关系的方法不返回任何内容,它们应该为使用它们进行查询构建的所有方法返回hasOnehasMany的结果。 / p>

PS:您应该为创建关系的其他方法添加return语句。

答案 1 :(得分:0)

如果您的中间表中有额外的列,则在定义关系时需要包含它们。

public function keys()
{
    $this->hasMany('App\Models\Game\Key')->withPivot('author_id','redeemer_id')->withTimestamps();

}