Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
817 views
in Technique[技术] by (71.8m points)

php - Laravel hasMany and belongsTo parameters

I have a table store, and store has many libraries, in library I have foreign key of store store_id.

Store table

id(PK)

Library table

id(PK)
store_id(FK)

I'm confused with hasMany and belongsTo parameters include, in the docs it says

return $this->hasMany('AppComment', 'foreign_key');

return $this->hasMany('AppComment', 'foreign_key', 'local_key');

return $this->belongsTo('AppPost', 'foreign_key', 'other_key');

Which table of hasMany foreign_key and local_key came from? Same with belongsTo which table of foreign_key and other_key came from?

Store model

public function library(){
    return $this->hasMany('AppLibrary', 'what_foreign_key_should_be_here','what_other_key_should_be_here');
}

Library model

public function stores(){
    return $this->belongsTo('AppStores', 'what_foreign_key_should_be_here', 'what_other_key_should_be_here');
}

Because sometimes I change my primary key id of a table to other name like sid, so I always want to specify which is foreign key and primary key

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

To simplify the syntax, think of the return $this->hasMany('AppComment', 'foreign_key', 'local_key'); parameters as:

  1. The model you want to link to
  2. The column of the foreign table (the table you are linking to) that links back to the id column of the current table (unless you are specifying the third parameter, in which case it will use that)
  3. The column of the current table that should be used - i.e if you don't want the foreign key of the other table to link to the id column of the current table

In your circumstance, because you have used store_id in the libraries table, you've made life easy for yourself. The below should work perfectly when defined in your Store model:

public function libraries()
{
    return $this->hasMany('AppLibrary');
}

Behind the scenes, Laravel will automatically link the id column of the Store table to the store_id column of the Library table.

If you wanted to explicitly define it, then you would do it like this:

public function libraries(){
    return $this->hasMany('AppLibrary', 'store_id','id');
}
  • A model standard is that singularly-named functions return a belongsTo, while a plural function returns a hasMany (ie. $store->libraries() or $library->store()).

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...