【问题标题】:Save user data on click button点击按钮保存用户数据
【发布时间】:2017-05-30 02:16:19
【问题描述】:

我正在使用 laravel 5.4,我有这个代码:

  public function apply($id){
    $user = User::where('id', $id)->get()->first();
    $data = [
      'name' => $user->first_name,
      'family' => $user->last_name,
      'email' => $user->email,
      'username' => $user->username,
      'gender' => $user->gender,
      'birthday' => $user->birthday,
      'cv' => $user->cv,
      'about' => $user->about,
      'education' => $user->education,
      'experiences' => $user->experiences,
    ];
    $company = Company::get()->first();

    Mail::send('emails.apply', $data, function ($message) use ($company)
    {

        $message->from('noreply@gmail.com', 'Robert Nicjoo');
        $message->subject('New Apply');
        $message->to($company->email);

    });
    Mail::send('emails.uapply', $data, function ($message) use ($user)
    {

        $message->from('noreply@gmail.com', 'Robert Nicjoo');
        $message->subject('You Applied successfully');
        $message->to($user->email);

    });

    Session::flash('success', 'Your application was sent to company.');
        return redirect()->back()->with('session', $data);
  }

当用户单击应用按钮并将用户信息发送给他们时,这将向公司发送电子邮件,现在我还想将用户的数据包括 user_id, ad_id and company_id 保存在另一个表中,以便用户和公司所有者都可以访问他们的应用广告的历史记录。

我也有这张表来保存数据:

  public function up()
    {
        Schema::create('applies', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->integer('ad_id')->unsigned();
            $table->integer('company_id')->unsigned();
            $table->timestamps();
        });

        Schema::table('ads', function($table) {
            $table->foreign('user_id')->references('id')->on('users');
            $table->foreign('ad_id')->references('id')->on('ads');
            $table->foreign('company_id')->references('company_id')->on('ads');
        });
    }

但是在我的控制器中(第一个代码)我需要知道如何将这些信息保存在新表中(第二个代码)?

更新:

广告模型>>

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Ad extends Model
{

    protected $fillable = [
        'company_id', 'title', 'slug', 'image', 'description', 'address', 'job_title', 'salary',
    ];

    public function company(){
       return $this->belongsTo(Company::class);
    }
    public function category(){
       return $this->belongsTo(Category::class);
    }
    public function location(){
       return $this->belongsTo(Location::class);
    }
    public function employment(){
       return $this->belongsTo(Employment::class);
    }
}

【问题讨论】:

  • 你为什么用get()->first(),直接用->first()。另一件事,您从哪里获得 company_id 和 ad_id ?
  • @Sagar get()->first() 没有理由只是老派的东西,我也更新了我的代码,因为它现在在我的系统中。
  • 但是没有包含 ad_id 的数据?你会从哪里得到?
  • 好的,该按钮位于ad(发布)页面内,该页面从另一个控制器处理并且数据已经传递给该控制器,因此当用户单击此按钮时,它确切地知道向哪个公司发送电子邮件the ad owner company 所以我的页面中已经有那些id's 也许我可以在这里使用它们,或者如果有必要我也可以在这里添加它。 (这是我的问题如何获取和传递数据)
  • 你能把你的路由添加到这个函数吗?

标签: php laravel laravel-5


【解决方案1】:

因为你的刀片是这样的:

<a class="btn btn-info btn-round" href="{{ route('apply.btn', Auth::user()->id) }}">

你的路线应该是这样的

Route::get('apply/{id}', 'ApplyController@apply')->name('apply.btn');

为什么只有 id ?因为在我们的讨论中,我发现 ad_idcompany_id 是从控制器中获取的......然后在你的控制器中这应该可以工作

public function apply($id)
{
    $ad = Ad::first(); 
    $company = Company::first(); 
    $apply = new Apply(); 

    $apply->user_id = $id 
    $apply->ad_id = $ad->id; 
    $apply->company_id = $company->id; 
    $apply->save();

    // some more codes //
}

为了避免重复使用 user_id .. 添加一个验证函数,如

function validateApply(array $data)
{
    return Validator::make($data, [
        'user_id'      =>  'required|numeric|unique:apply,user_id,NULL,id,ad_id,'.$data->ad_id,
    ]);
}

unique:apply - 这意味着它将检查 user_id 已经应用的应用表..

然后在上面的代码中做

$validateApply= $this->validateApply(['user_id'=>$id,'ad_id'=>$ad->id]);
if(!$validateApply->fails())
{
    // do the above code here
}
else
{
    // duplicate !!! so do your code here
}

然后检索数据假设 apply 已经属于该用户以及该用户有一个 apply

Auth::user()->apply->first()->somefield;
// im not sure how the hasOne works but try
Auth::user()->apply->somefield;

【讨论】:

  • 所以它实际上回到了我的第一个代码,除了删除的请求,它现在可以工作了,非常感谢,但是有两个问题...... 1-如何停止重复?用户只能申请一次。 2- 我无法在刀片中获得结果。
  • 你认为我们不应该比较吗?例如。如果我们只检查用户 ID,这意味着用户只能在一个广告中申请,而事实上用户应该能够申请尽可能多的 s(he) 想要的,而不是同一个广告。我认为如果我们比较 user_id 和 ad_id 最好这样一个用户只能在每个广告中申请一次,因为也会检查 ad_id。如果我错了,请告诉我
  • ahhh .. 好的 .. 现在我明白了 .. 1 个广告 = 1 个适用于每个用户,对吗?公司怎么样?
  • 是的,公司无关紧要,也许一家公司有 5 个广告,用户想申请所有职位,但每个职位只能申请一次
  • 你去 .. 更新了验证 .. 我们所做的是避免在 ad_id 中使用 user_id 重复 ..
【解决方案2】:

您的路线应该是:

Route::post('apply/{$user_id}/{company_id}/{ad_id}','ApplyController@apply');

我认为您已经创建了广告模型。

所以,只需像这样保存数据:

你的功能是这样的

public function apply(Request $request){

    // other code

    $apply = new Apply();
    $apply->user_id = $request->user_id; 
    $apply->ad_id = $request->ad_id;
    $apply->company_id = $request->company_id;
    $apply->save();

    // other code
}

还有一件事,你的帖子请求中应该有 ad_id。

【讨论】:

  • 那么您建议我将其添加到我的广告模型中吗?以及模型将如何保存数据? + 在用户单击应用按钮然后获取这些信息之前,我不希望将任何内容保存到 apply_table。例如,如果ad 1 没有任何用户申请,那么apply_table 将不会有任何保存我希望我解释得很好!
  • 当用户点击应用按钮时,您必须将数据插入应用和广告表,对吗?
  • 没有广告表,只有 applies 表。广告表仅用于保存帖子等广告。此信息将保存在applies 表中
  • 我还添加了我当前的Ad Model
  • 您的代码中的其他代码是什么?! PS:我也有 Apply 模型,我不应该把这个加到那个表中吗?直接保存在那个表中!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2021-10-25
相关资源
最近更新 更多