字符串类型的拉拉维尔外键(空问题)



我正在尝试从用户表中获取(然后显示(带有文章表中外键的创建者/作者姓名。我只是 laravel 的新手,希望你能帮助我解决这个问题。我对 int 类型 F 键没有问题,但对于字符串类型,我可能在某处缺少一些东西。有时它会给我一些错误,有时一切正常,但文章表上的user_name只是保持空。如果您需要有关某事的更多信息,请发表评论。提前感谢!

文章的架构

Schema::create('articles', function (Blueprint $table) {
      $table->engine = 'InnoDB';
      $table->increments('id');
      $table->integer('user_id')->unsigned();
      $table->string('user_name')->nullable();
      $table->string('title');
      $table->text('body');
      $table->timestamps();
      $table->timestamp('published_at');
      $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
      $table->foreign('user_name')
            ->references('name')
            ->on('users')
            ->onDelete('cascade');
  });

用户的架构

        Schema::create('users', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->string('name')->unique();
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->rememberToken();
        $table->timestamps();
    });

不要在文章中保存用户名。您只需保存用户 ID 并在模型中创建关系,例如

class User extends Model {
  public function articles() {
    return $this->hasMany('AppArticle');
  }
}
class Article extends Model {
  public function user() {
    return $this->belongsTo('AppUser');
  }
}

如果您的关系设置正确,您可以像这样访问用户名:

$article->user->name

在另一个方向上,你可以用以下方式让用户的文章:

$user->articles

注意:关系的处理方式与属性不同,而不是函数。

我的建议是...

  1. 从文章中删除user_name。 让user_id引出用户数据。
  2. 使用Laravel的内置用户类来扩展模型
  3. 创建文章类以扩展模型
  4. 设置它们之间的关系

应用/用户.php

namespace App;
use IlluminateDatabaseEloquentModel;
use ...
class User extends ...{
    public function Articles(){
        return $this->hasMany(Articles::class)
    }
}

应用/文章.php 使用Illuminate\Database\Eloquent\Model;

namespace App;
class Article extends Model{
    public function User(){
        return $this->belongsTo(User::class);
    }
    public function getAuthorAttribute(){
        return $this->User->name;
    }
}

现在,您可以以以下身份访问数据...

$user->Articles;
$article->User
$article->author

若要优化访问,可以通过将任何关系作为函数调用来获取查询生成器。

$user->Articles()->where('title, 'like', 'cars')->get()

看看发生了什么...

$user->Articles()->where('title, 'like', 'cars')->toSql()

相关内容

  • 没有找到相关文章

最新更新