2016-04-13 13 views
0

私は5.1 Laravelアプリケーションで作業しています。そのアプリでは、Bussiness Model(スペイン語でNegocioという名前)とUser Modelの間にOnetoMany Relationshipがあります。ユーザーを登録するとトークンを作成し、それをユーザーテーブルに保存して電子メールの確認に使用します。Eloquent RelationShip Laravel 5.1

ユーザーがアカウントを確認したら、コントローラで受信したトークンを使用してディレクトリを作成しますそのユーザーが関連しているビジネスの名前を 'public/negocios /'に入力します。私が持っているuserconfirmartionに私のコントローラでそう

私は、ディレクトリの名前として商務名を取得するディレクトリを作成する機能を持っている私のビジネスモデルで
public function emailConfirm($token) 
{ 
    try { 
     //getting the bussiness that user is related to 
     $negocio = App\Negocio::with(['user' => function ($query) use($token) { 
      $query->where('token', 'like', $token); 
     }])->firstOrFail()->folderProfile(); 

     //Then we activate the user account 
     $user = User::whereToken($token)->firstOrFail()->confirmEmail(); 
     return redirect('/login')->with('mensaje', '¡Su cuenta de usuario se ha activado, ahora puede iniciar sesión en su cuenta!'); 

    } catch (ModelNotFoundException $e) { 
     return redirect('/login')->with('mensaje', 'Ya se ha confirmado a este usuario, solo inicie sesión ¬¬'); 
    } 
} 

public function folderProfile() 
{ 
    $name = str_replace(' ', '', $this->nombre_negocio); 
    $ruta_a_public = public_path().'/negocios/'; 
    $ruta_a_public .= $name; 
    File::makeDirectory($ruta_a_public, $mode = 0777, true, true); 
} 

問題はphp artisan tinkerのコードを調査しているEloquentは、ユーザーが関連するビジネスだけでなく、データベースに記録されたすべてのビジネスを取得します。

(ビジネスモデル上)で失敗した部分を期待通りにあなたが私に私の「クエリ」の作業を行うための最善の方法を言うことができるかどうかはあなたから理解されるだろう:

$negocio = App\Negocio::with(['user' => function ($query) use($token) { 
      $query->where('token', 'like', $token); 
     }])->firstOrFail()->folderProfile(); 

:私のNegocioモデル(スペイン語で商務モデル)で :私は https://laravel.com/docs/5.1/eloquent-relationships#querying-relations

EDITに読んだ上でそれをベース

public function negocio() 
{ 
    return $this->belongsTo('App\Negocio', 'negocio', 'codigo_negocio'); 
} 

みんなありがとう...この長い記事のために申し訳ありません:

public function user() 
{ 
    return $this->hasMany('App\User', 'negocio', 'codigo_negocio'); 
} 

とユーザーモデルでは、私はこれを持っています。

+0

こんにちはElotgamuさん、 あなたのテーブルを簡単に説明して、ユーザーテーブルとBussinesモデルの実際の関係を確認してください。 –

+0

編集済み...私のモデル関係をユーザーとビジネスモデルの間に追加しました – elotgamu

答えて

0

それはdiffentロジックだが、おそらくヘルプ:

//First search for the user 
$user = App\User::where('token','like','%' . $token . '%')->first(); 

//Then search for the business 
$negocio = App\Negocio::where('user_id',$user->id)->first(); 

テーブル間の関係を定義することを忘れないでください。

ところで、あなたはここ%を忘れて:

$query->where('token', 'like', '%' . $token . '%'); 

を使用すると、まったく同じトークンを探している場合は、この使用する必要があります。さらにlaravelのドキュメントにhttps://laravel.com/docs/5.1/eloquent-relationships読んだ後

Something::where('token',$token) 
+0

ええ、このアプローチもありますが、ビジネスモデル**には多くのユーザーがおり、ユーザーはビジネスに属しているという問題があります。 – elotgamu

+0

私はビジネスを得ることができません。私はあなたがアドバイスした通りに正確なトークンを探してみましたが、私は記録されたすべてのビジネスを使ってEloquentコレクションを手に入れました。だから問題はまだそこにあります...回答と私を助けてくれてありがとう... :) – elotgamu

+0

私はあなたのモデルが正しくないと思う、ここでは、ドキュメントの例です: '$ this-> hasMany( 'App \ Something '、' foreign_key '、' local_key ') ' first()やfind()メソッドを使用すると、複数のビジネスを取り戻すことができません。 – szebasztian

0

を私のために働き、期待される記録を得る方法は以下の通りです:

$negocio = App\Negocio::whereHas('user', function ($query) use($token) { 
      $query->where('token', $token); 
     })->firstOrFail()->folderProfile(); 

このように私はトークンの所有者が関連する正しいビジネスを手に入れてください... 敬語ORMにquerysを構築することについて、私のためのいくつかの新しいヒントをありがとう@szebasztian。