Laravel 插入 2 个表
Posted
技术标签:
【中文标题】Laravel 插入 2 个表【英文标题】:Laravel inserting into 2 tables 【发布时间】:2016-10-26 17:07:48 【问题描述】:我有两个表user
和tn_user
,表user
是一个包含登录信息的表,我是通过https://laravel.com/ 的教程制作的,所以基本上它是自动创建的,而tn_user
是一个我自己做的桌子
用户表 万一你看不到属性是
id
,name
,password
,那么重要的事情,password
在这个表中是用来登录的TN_USER 表 属性是
cn_id
、cv_name
、cv_email
、cn_phone
、cv_position
、cv_address
、cv_country
、cv_username
、cv_password
、cv_privileges
,这些是重要的p>
根据下面的表格,我想将username
和password
插入到表user
中,其余的插入到表tn_user
中,我该怎么做?我对 laravel 很陌生,所以不太了解如何,通常我使用 CI
UserController.php 这是我用来插入数据的代码 我使用 json 响应来解析数据,不太确定如何将数据插入到 2 个表中,这里没有什么帮助
public function createOrEdit()
//get current user
$currentUserId = Auth::user()->id;
$isUpdate = false;
$id = Input::get('id');
$user = new UserCompany;
if($id != "")
$user = UserCompany::where('cn_id', '=', $id)->firstOrFail();
$user->cv_updated_by = $currentUserId;
$user->cv_updated_at = Carbon::now();
$isUpdate = true;
else
$user->cv_created_by = $currentUserId;
$user->cv_created_at = Carbon::now();
$user->cv_name = Input::get('name');
$user->cv_position = Input::get('position');
$user->cv_email = Input::get('email');
$user->cn_phone = Input::get('phone');
$user->cv_address = Input::get('address');
$user->cv_username = Input::get('username');
$user->cv_password = Input::get('password');
$user->cv_country = Input::get('country');
if($isUpdate)
UserCompany::where('cn_id','=',$id)->update(['cv_updated_by' => $user->cv_updated_by,
'cv_updated_at' => $user->cv_updated_at,
'cv_name' => $user->cv_name,
'cv_position' => $user->cv_position,
'cv_email' => $user->cv_email,
'cn_phone' => $user->cn_phone,
'cv_country' => $user->cv_country,
'cv_username' => $user->cv_username,
'cv_password' => $user->cv_password,
'cv_address' => $user->cv_address]);
else
$user->save();
$returnedData = UserCompany::all();
$response = array(
'content' => $returnedData,
'status' => 'success',
);
return Response::json($response);
UserCompany.php 是我的模型,但由于我是新手,我还不太了解如何使用关系
<?php namespace Activity;
use Illuminate\Database\Eloquent\Model;
class UserCompany extends Model
protected $table = 'tn_user';
public $timestamps = false;
protected $fillable = [
];
/*public function usercompany()
return $this->belongsTo('Activity\user');
*/
【问题讨论】:
如何保持两个表之间的关系?什么是外键? 嗯,你说得对,我还在想它 我更改了一些属性,在user
表id
我将其更改为id_user
,然后在tn_user
我添加另一个字段名称id_user
,所以外键是@987654356 @
【参考方案1】:
您应该知道,在UserCompany
类中,通过设置fillable
,这意味着您正在设置要更改的表列,在本例中为tn_user
表。所以这意味着,通过设置
protected $fillable = [];
这意味着,当您使用以下命令时,您不应该修改任何表列;
$user_details->cv_name = Input::get('cv_name');
好的,所以你应该知道的第一件事是,当创建两个表时,即users
和tn_users
,你应该有一个包含与这两个表相关的值的列,我建议你是用户@来自users
表的987654330@:
我注意到您使用cn_id
作为链接器,但最好是每个表都有自己的递增 id 列,在这种情况下,还有自己的 link_id 列
假设你要重新开始:
打开 命令提示符 或 终端 并转到您的 laravel 项目文件夹目录并输入:-$ php artisan make:model User -m
并再次输入 -$ php artisan make:model UserDetail -m
这将做的是,创建User
和UserDetail
,并添加-m 意味着它为create_users_table
和create_user_details_table
关联的模型创建迁移
从create_users_table
只需创建所需的表列,如下所示:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('users', function (Blueprint $table)
$table->increments('id');
$table->integer('auth');
$table->string('username')->unique();
$table->string('email');
$table->string('password');
$table->boolean('online');
$table->string('lang', 2);
$table->rememberToken();
$table->timestamps();
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
//
Schema::drop('users');
现在create_tn_users_table
有点重要,您应该设置与用户帐户的链接,以便假设您删除用户,他的凭据也会被删除,但如果您愿意,您可以这样做。
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTnUsersTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('tn_users', function (Blueprint $table)
$table->increments('id');
$table->string('full_name');
$table->string('username')->unique();
$table->integer('link_user_id')
->references('id')->on('users'); // Relationship btn table tn_users and users
$table->string('phone');
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::drop('tn_users');
现在转到命令提示符或终端并输入-$ php artisan migrate
以创建表格。
再次在命令提示符或终端输入-$ php artisan make:controller UserController --resource
,然后将控制器与其资源一起制作。
在 UserController 内的 create()
函数中,添加 Request
作为参数。
提交您创建的表单后即可使用功能
namespace App\Http\Controllers;
use App\User;
use App\TnUser;
use ...
class UserController extends Controller
public function create(Request $request)
$tn_user = new TnUser();
$user = new User();
$user->username = $request['username'];
$user->password = bcrypt($request['username']);
...
$user->save();
$tn_user->full_name = ucword(strtolower($request['full_name'));
$tn_user->link_user_id = $user->id; // uses the previously save id
$tn_user->phone = trim($request['phone']);
$th_user->save();
我希望我已经回答了你的问题。以下是一些有用的学习链接。
https://laravel.com/docs/5.1/migrations#creating-columns https://laravel.com/docs/5.1/requests【讨论】:
【参考方案2】:你创建了 2 个对象
$user = new User()
$user->username = INPUT::get('username');
$user->password = $password // Hashed
$user->save();
$user_detail = new UserCompany() // Your detail table modal.
$user_detail->cv_name = Input::get('cv_name');
//etc
$user_detail->save()
【讨论】:
我的模型中的关系怎么样?以上是关于Laravel 插入 2 个表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 中将数据从 1 个视图插入到 2 个表中
如何使用 laravel 集合获取最后插入的 ID 并将其插入到第二个表中?