字符串类型的laravel外键(null问题)

时间:2018-04-17 14:19:50

标签: php string laravel null key

我正在尝试从users表的articles表中获取(然后显示)带有外键的创建者/作者名称。我只是喜欢laravel我希望你可以帮我解决这个问题。我没有int类型F-key(s)的问题但是对于字符串类型我可能在某处丢失了某些东西。有时它会给我一些错误,有时候一切正常但文章表上的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();
    });

2 个答案:

答案 0 :(得分:0)

请勿在文章中保存用户名。 您只保存用户ID并在模型中创建关系,如

class User extends Model {
  public function articles() {
    return $this->hasMany('App\Article');
  }
}

class Article extends Model {
  public function user() {
    return $this->belongsTo('App\User');
  }
}

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

$article->user->name

在另一个方向,您可以使用以下用户文章:

$user->articles

注意:关系的处理方式与属性类似,而不像函数一样。

答案 1 :(得分:0)

我的建议是......

  1. 从文章中删除user_name。让user_id引导用户数据。
  2. 使用laravel内置的User类扩展Model
  3. 制作文章类以扩展模型
  4. 设置他们之间的关系
  5. 应用/ user.php的

    namespace App;
    use Illuminate\Database\Eloquent\Model;
    use ...
    
    class User extends ...{
    
        public function Articles(){
            return $this->hasMany(Articles::class)
        }
    }
    

    应用/ Article.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()