如何使用Polymorphic创建跟随者关系与Laravel的多对多关系?

时间:2017-02-13 14:02:57

标签: php laravel eloquent many-to-many polymorphic-associations

好的,所以我正在尝试创建一种用户可以关注其他用户或关注类别的关系。我建议使用Polomorpic Many to Many关系。现在我正在尝试创建一个关注者 - followee 关系,但我无法理解如何设置模型和控制器。

TABLES

用户

        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('email');
            $table->string('password');
            $table->string('first_name');
        });

分类

        Schema::create('categories', function (Blueprint $table) {
            $table->increments('id');
            $table->string('category');
        });

Followables

        Schema::create('followables', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
            $table->integer('user_id');
            $table->integer('followable_id');
            $table->string('followable_type');
        });

模型

用户

class User extends Model implements Authenticatable 
{

    public function followers()
    {
        return $this->morphToMany('App\Followable', 'followable');
    }

    public function following()
    {
        return $this->morphedByMany('App\Followable', 'followable');
    }

    //Use to get id from Auth facade
    public function getId()
    {
        return $this->id;
    }
}

从动的

class Followable extends Model
{

    protected $fillable = ['user_id'];

    public function followable()
    {
        return $this->morphTo();
    }

}

类别模型关注者关系尚不存在,所以我现在暂时离开。

CONTROLLER

FollowableController

class FollowableController extends Controller
{

    public function followUser($followable_id){

        $user_id = Auth::user()->getId();
        $followee = User::find($followable_id);
        $followee->followers()->create(['user_id' => $user_id]);


        return redirect()->route('get.user', ['user_id' => $followable_id]);
    }

}

说实话,我对我创建的代码感到有点困惑。这是一些复制和粘贴而不理解我所做的100%。无论如何,这将在数据库中创建两个记录,如下所示:

从动的

-------------------------------------------------
|Id | user_id | followable_id | followable_type |
-------------------------------------------------
|22  | 4       | NULL          | NULL            |
-------------------------------------------------
|23  | 0       | 22            | App\User        |
-------------------------------------------------

followable_id是错误的,似乎使用在Followable表中创建的Id而不是User表中的user_id。

那么,如何通过 right followable_id 解决只有一条记录被保存到数据库?

1 个答案:

答案 0 :(得分:0)

我猜你使用的是错误的方法。我在Laravel的doc示例之后做了类似的事情,并且morphMany()已经足够了,因为User可以有很多关注者,这些关注者本身就是user所以你可以拥有:

User型号:

public function followers()
{
    return $this->morphMany('App\Followable', 'followable');
}

然后你可以从控制器设置user_id(但不要忘记将它添加到fillable)。

希望有所帮助:)