【问题标题】:Cant attach news items to user in pivot table无法将新闻项目附加到数据透视表中的用户
【发布时间】:2020-09-01 13:24:20
【问题描述】:

这是a previous post的后续帖子

我正在尝试通过数据透视表将新闻项目附加到用户,以便我可以在每个用户登录后向他们显示新闻项目。这个想法是当用户看到一个项目时,他们可以选中一个框以分离该项目,而不再看到它。

我的新闻项目似乎正在保存,但数据透视表中没有保存任何内容以将它们与用户关联。理想情况下,当一条新闻被保存时,它应该附加到所有用户。

迁移

create_news_table

class CreateNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('news', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('body');
            $table->boolean('sticky');
            $table->boolean('draft');
            $table->timestamps();
        });
    }

create_news_user_pivot_table

class CreateNewsUserPivotTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('news_user', function (Blueprint $table) {
            $table->integer('user_id')->unsigned();
            $table->integer('news_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')
                ->onDelete('cascade');
            $table->foreign('news_id')->references('id')->on('news')
                ->onDelete('cascade');
            $table->timestamps();
        });
    }

模型

News.php

namespace App;

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

class News extends Model
{
    protected $table = 'news';
    protected $fillable = ['title', 'body', 'sticky', 'draft',];

    public function users() 
    {
        return $this->belongsToMany('App\News')->withPivot('user_id', 'news_id');
    }
}

User.php

class User extends Authenticatable {

        use Notifiable;
        use SoftDeletes;


        //protected $table = "users";
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name',
            'email',
            'password',
            'profilePic',
            'role',
            'verify',
            'first_time_login',
            'changedPasswordDate',
            'needToChangePassword',
            'userRoles'
        ];

        protected $dates = ['deleted_at'];

        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'password', 'remember_token',
        ];

        public function news() {
            return $this->belongsToMany('App\News')->withPivot('user_id', 'news_id');
        }
}

NewsUser.php(甚至不确定我需要数据透视表的模型)

namespace App;

use Illuminate\Database\Eloquent\Model;

class NewsUser extends Model {

    protected $table = 'news_user';
    protected $fillable = ["user_id", "news_id"];
}

控制器的相关功能

public function saveNews(Request $request) {
        $user = Auth::user();

        $news = new News;
        $news->title = $request->title;
        $news->body = $request->body;
        $news->sticky = $request->sticky;
        $news->draft = $request->draft;
        $news->save();
        $user->news()->attach($news->id);
    }

我意识到这最后一个函数只是试图将新闻帖子添加到当前用户,但如果我解决了这个问题,那么我以后可以弄清楚如何将新闻项目附加到所有用户。我猜是这样的:

$users = \App\User::all()

foreach $users as $user {
    $user->news()->attach($news->id);
}

【问题讨论】:

  • 您是否收到任何实际的错误消息?如果不是,您的应用是否处于调试模式?
  • 应用程序处于调试模式,但我没有得到通常的 laravel 调试页面并出现错误。

标签: php laravel eloquent model


【解决方案1】:

我在这里猜测return $this->belongsToMany('App\News')->withPivot('user_id', 'news_id');

也许在用户模型中尝试return $this->belongsToMany('App\News', 'news_user', 'user_id', 'news_id');,在新闻模型中反之亦然,因为belongsToMany() 将出现外键,withPivot() 添加了额外的属性,但您使用它的外键,因为它是额外的属性

【讨论】:

    【解决方案2】:

    我在一个地方查看所有代码时发现了几个问题。

    News.php

    public function users()
    

    应该是

    public function user()
    

    它也返回错误,'App\News' 应该是 'App\User'

    return $this->belongsToMany('App\News')->withPivot('user_id', 'news_id');
    

    应该是

    return $this->belongsToMany('App\User', 'news_user', 'news_id');
    

    然后在我的控制器中,在保存后将新闻项附加到所有用户

    foreach ($users as $user) {
        $news->user()->attach($user->id);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      相关资源
      最近更新 更多