如何填写Laravel中的外键字段?

时间:2015-10-29 21:56:14

标签: laravel

我有一个名为Pictunes的表,其中有一个名为post_creator的列。在此表中,有一个包含整数值(外键)的列,表示另一个名为id的表中的Users列。

username表格中还有一个Users列。我想用此值填写外键(在post_creator列的Pictunes列内),因此post_creator将是username而不是视图中的整数。我不是想改变数据库数据。

我很难弄清楚要引用这个问题的内容,更不用说找到它的答案了。我正在使用PSQL和Laravel 5.1。谢谢!

更新,以下是我的模型和数据库列:

Pictune型号»     

namespace Pictunes;

use Illuminate\Database\Eloquent\Model;

class Pictune extends Model {
    /**
     * Mass assignable properties
     */
    protected $fillable = [
      'post_creator',
      'image_name',
      'audio_name'
    ];

    /**
    * Pictunes have only one post creator
     */
    function creator() {
      return $this->belongsToMany('Pictunes\User', 'pictune_creator', 'post_creator', 'pictune_id')->withTimestamps();
    }

    /**
     * Pictunes have multiple tags
     */
    function tags() {
      return $this->belongsToMany('Pictunes\Tag')->withTimestamps();
    }
}

User型号»     

namespace Pictunes;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract,
  AuthorizableContract,
  CanResetPasswordContract {
    use Authenticatable, Authorizable, CanResetPassword;

    /**
     *  Mass assignable properties
     *
     * @return array
     */
    protected $fillable = [
        'username',
        'email',
        'password',
        'selfie_name'
    ];

    /**
     * Encrypt the password before sending it to the database
     *
     * @return void
     */
    public function setPasswordAttribute($to) {
        $this->attributes['password'] = bcrypt($to);
    }

    /**
     * Make the email value lower case
     *
     * @return void
     */
    public function setEmailAttribute($to) {
        $this->attributes['email'] = strtolower($to);
    }

    /**
     * Each user has many Pictunes
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    function pictunes() {
        return $this->belongsToMany('Pictunes\Pictune', 'pictune_creators', 'id', 'post_creator');
    }
}

数据库表»

Database tables

pictunes列»

<code>pictunes</code> columns

users列»

<code>users</code> columns

更新,我还能做些什么来让这个更容易回答吗?我觉得此时最好的解决方案是使用SQL语句,因为Eloquent似乎只能通过一个不必要且过度的数据透视表提供此功能。

1 个答案:

答案 0 :(得分:0)

您通过Eloquent使用关系。确保将额外参数传递给模型中的关系,例如return $this->belongsTo('App\Country', 'city_id')。如果您不遵守惯例,则需要更改'city_id'部分以与列名对应。这适用于您正在使用的任何关系,但您要确保知道哪个关系在哪里,因为我认为每个方法的额外参数不同。