假设您有另一个表名为users 的模型用户。您可以在addresses 和users 之间定义如下关系,
public function up()
{
Schema::create('addresses', function(Blueprint $table)
{
$table->increments('id');
$table->string('add1');
$table->string('add2');
$table->string('city');
$table->string('contact_no');
$table->enum('is_primary',['yes','no'])->default('no');
$table->integer('user_id')->unsigned();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
在用户模型类中,
class User extends Model {
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'users';
public function addresses()
{
return $this->hasMany('App\Address');
}
}
在地址类中
class Address extends Model {
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'addresses';
public function user()
{
return $this->belongsTo('App\User');
}
}
有关创建表的更多详细信息可以在 Laravel 上的官方Schema Docs 找到。还有更多关于关系的信息here
更新
根据this 的问题,您必须先创建引用表,然后再引用表。在我们的例子中,users 必须在您运行迁移以创建 addresses 表之前存在。
简单用例
假设,在控制器中你想知道特定用户有多少个地址,你可以这样做,
$addressCount = User::find($userId)->addresses->count();
请注意User::find($userId)->addresses返回相关模型的集合,而User::find($userId)->addresses()返回HasMany类型的对象
你也可以像下面这样遍历集合,
foreach(User::find($userId)->addresses as $address)
{
echo '<pre>';
print_r($address);
}
另一方面,您可以获取与特定地址关联的用户,如下所示,
$user = Address:find($addressId)->user; //returns object of type `User`
echo $user->first_name;
以下将不工作
$user = Address:find($addressId)->user(); //returns object of type `belongsTo`
echo $user->first_name;
注意,上面的Address:find($addressId)->user 不会返回集合,而是返回 User 类的单个对象。这是因为 belongsTo 关系。
我希望我已经为您说明了一切。但没有什么比官方docs好。
Laracast 视频更适合 Laravel。