質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1216閲覧

リレーション先のデータを取得する

tktail

総合スコア72

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/07/15 07:07

編集2020/07/16 01:54

以下のようなテーブルがあります。

【Aテーブル】
id
prefecture

【Bテーブル】
id
weather_id

AテーブルとBテーブルはprefecureとidをhasOneで紐づけしています。

public function Prefectures(){ return $this->hasOne('App\Models\Prefecutre', 'id', 'prefecture'); }

Aテーブルを使用したページを作成しており、コントローラーでBテーブルのweather_idを取得したいと考えています。
調べた結果whereHasメソッドで取れると思いましたので以下のように書きましたが、$prefには何も取ってこれていないようです。

$pref = Hoge::whereHas('prefectures', function($query){ $query->where('id', 'weather_id'); })->get();

基本的な部分かもしれませんが、お教え頂きたいと思います。
よろしくお願い致します。


use Illuminate\Http\Request; use App\Models\Prefecture; use Weidner\Goutte\GoutteFacade as GoutteFacade; cladd DriveController extends Controller { protected $pref; public function __construct(Prefecture $prefecture){ $this->pref = $prefecture; } public function page($id){ $attribute = Attribute::all(); $dd_data = $this->rm->find($id); //お天気プログラム //ここに$prefが必要 $weather_url = 'https://www.jma.go.jp/jp/week/' . $pref . '.html'; $goutte = GoutteFacade::request('GET', $weather_url); $weathers = array(); $goutte->filter('.for')->each(function ($node) use (&$weathers) { $weathers[] = $node->text(); }); $params = [ 'texts' => $weathers, ]; return view('Drive/page', compact('attribute', 'dd_data'), $params); } }

Prefecture Table (DB)
id / name / weather_id

Driveにはprefectureというidを保持しており、PrefectureテーブルとHasOneでリレーションしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SanQ

2020/07/15 08:21

->get()の部分を->first()にして、$pref->weather_idを表示した場合も何も取ってこれませんか?
hayato7

2020/07/15 09:03

メソッド名はPrefecturesと複数形になっていますが、hasOneを利用しています。 テーブルの関係は、1対1の関係で間違いないでしょうか。
tktail

2020/07/15 16:45

SanQさん ご回答ありがとうございます。 とりあえず、dd($pref->weather_id)で表示を試みましたが SQLSTATE[42S22]: Column not foundというエラーをはきました。 たしかにエラー文に書いてある内容のカラムはありません。 引数のところはidとweather_idでよろしいのでしょうか?
tktail

2020/07/15 16:46

hayato7さん ありがとうございます。 1対1の関係で間違いないかと思います。 Modelの関数を複数形にしていたので、prefecturesとなっています。
hayato7

2020/07/16 00:43 編集

返答いただきありがとうございます。もう一つだけ質問させてください。 > Aテーブルを使用したページを作成しており、コントローラーでBテーブルのweather_idを取得したいと考えています。 whereHasはリレーション先に持つデータの条件をつけるものなので、取得したいだけであれば、whereHasは必要ありません。リレーションを利用すれば取得できます。weather_idを取得したいのでしょうか、それともweather_idがある値のPrefectureを取得したいのでしょうか? もし嫌でなければですが、テーブル名やHogeなどはぼかさず書いていただいた方が、状況に沿った回答がしやすいです。
tktail

2020/07/16 02:46

ありがとうございます。 コントローラー部分のコードを追記しました。 ご確認頂いてもよろしいでしょうか?よろしくお願い致します。
guest

回答2

0

自己解決

$pref = Prefecture::find($dd_data->prefecture-1)->weather_id;

hayato7さんがおっしゃっていたように、リレーションの問題だけで取ってこれるのではないか?と考え、
以上のコードで解決出来ました!
ご回答いただいたお二方、ありがとうございます。

投稿2020/07/16 05:04

tktail

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

原因はfunction($query)としたことでメソッドインジェクションができていないからだと思います。
もし原因がこれであるのなら、データを取得したいファイルにuse Illuminate\Database\Eloquent\Builder;を加えBuilderクラスを呼び出し、function($query)function(Builder $query)に変えるとうまくいくと思います。

投稿2020/07/15 17:26

SanQ

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tktail

2020/07/16 02:47

ありがとうございます。 どちらも設定してみましたが、NULLが帰ってきてしまいました。 コントローラー全体のコードを追記しましたので、ご確認頂けますでしょうか? よろしくお願い致します。
SanQ

2020/07/16 03:07

$query->where('id', 'weather_id')だと、App\Models\Prefecutredeで設定しているデータベースの「id」の値が「weather_id」のレコードを持ってくることになると思うので、$query->where('id', 'weather_id')の'weather_id'を1などの整数値('id'は整数値と想定)に変えてみてはどうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問